Есть ли способ применить порог к изображению по 1 строке за раз? - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь применить порог к изображению по 1 строке за раз. Я хочу иметь возможность выбрать строку, в которой порог будет начинаться и заканчиваться. Ex. если у меня есть изображение 1000 x 1000, я хотел бы применить свой порог, начиная со строки 200 и заканчивая строкой 850. В настоящее время я могу применить порог ко всему изображению.

img = cv2.imread("*.png",0)
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)

titles = ['Original Image','BINARY']
images = [img, thresh1]

for i in range(2):
    plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

1 Ответ

3 голосов
/ 09 апреля 2019

Есть несколько способов сделать это, поэтому я перейду от самого простого и быстрого к более гибкому и медленному ...

Самый простой и быстрый, если ваша замаскированная область очень проста, как ваша:

import cv2

# Load Paddington as greyscale
img = cv2.imread('paddington.png',0)

# Define a region of interest, in this case entire rows 100-300
ROI = slice(100,300) 

# Threshold the region of interest, and reinsert back into image
ret,img[ROI] = cv2.threshold(img[ROI],127,255,cv2.THRESH_BINARY)  

enter image description here

Обратите внимание, что я объявил ROI как переменную только в одном месте, чтобы обе стороны знака равенства оставались правильными, если вы измените размер маски - избежание проблем с обслуживанием!


Если ваша замаскированная область не была целыми строками, вы можете создать кортеж из кусочков:

# Declare ROI
ROI = slice(100,300),slice(10,390)

# Threshold with mask
ret,img[ROI] = cv2.threshold(img[ROI],127,255,cv2.THRESH_BINARY)

enter image description here


Если ваша замаскированная область более сложна, например, составные фигуры, контур или круг, вы бы пороговое изображение целиком, затем создать маску того же размера, заполненную черным, нарисовать ваши фигуры в белом, а затем выбрать пороговое изображение или исходное изображение в каждом пикселе в зависимости от маски:

# Make a mask the same size as the image and fill with black
mask = np.zeros_like(img)

# Draw a filled white circle onto the black mask
mask = cv2.circle(mask,(200,100),100,1,-1) 

# Threshold the entire image
ret,thresh = cv2.threshold(img,127,255,cv2.THRESH_BINARY) 

# Select either the original or the thresholded image at each pixel, depending on the mask
img = np.where(mask>0,thresh,img) 

enter image description here


Вот оригинальное изображение молодого жулика:

enter image description here

Ключевые слова : Python, OpenCV, Numpy, изображение, обработка изображений, маска, маскировка, порог, фильтр, ROI, область интереса

...