Есть несколько способов сделать это, поэтому я перейду от самого простого и быстрого к более гибкому и медленному ...
Самый простой и быстрый, если ваша замаскированная область очень проста, как ваша:
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)
Обратите внимание, что я объявил 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)
Если ваша замаскированная область более сложна, например, составные фигуры, контур или круг, вы бы пороговое изображение целиком, затем создать маску того же размера, заполненную черным, нарисовать ваши фигуры в белом, а затем выбрать пороговое изображение или исходное изображение в каждом пикселе в зависимости от маски:
# 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)
Вот оригинальное изображение молодого жулика:
Ключевые слова : Python, OpenCV, Numpy, изображение, обработка изображений, маска, маскировка, порог, фильтр, ROI, область интереса