一、ROI
ROI:region of interest,即感兴趣区域。
一般主要通过numpy来获取ROI
将某区域转变为灰色图片再覆盖原图像
import cv2
import numpy as npsrc = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)roi = src[0:100,0:100]
gray = cv2.cvtColor(roi,cv2.COLOR_BGR2GRAY)
back = cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)
src[0:100,0:100] = back
cv2.imshow("roi ",src)cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下:
二、彩色图像的泛洪填充
泛洪填充,如何填充一个对象内部区域
FLOODFILL_FIXED_RANGE
改变图像,泛洪填充
FLOODFILL_MASK_ONLY
不改变图像,只填充遮罩层本身,忽略新的颜色值参数
floodFill(Mat image,Mat mask,Point seedPoint,Scalar newVal)
floodFill(image,mask,seedPoint,newVal,rect,IoDiff,upDiff,flags)
src(seed.x,seed.y) - IoDiff <= src(x,y) <= src(seed.x,seed.y) + upDiff
cv2.floodFill(copyImg,mask,(30,30),(0,255,255),(100,100,100),(50,50,50),cv2.FLOODFILL_FIXED_RANGE)
在(30,30)处的像素值-(100,100,100)处的像素值,所得的结果为要填充的像素的最小值
在(30,30)处的像素值+(50,50,50)处的像素值,所得的结果为要填充的像素的最大值
cv2.FLOODFILL_FIXED_RANGE表示在(30,30)这个位置周围的且像素值在最大值和最小值之间的区域都填充成(0,255,255)黄色
np.zeros([h+2,w+2],np.uint8)
,mask的大小必须是h+2,w+2,类型是uint8,这是OpenCV的规定。
import cv2
import numpy as npdef fill_color(image):copyImg = image.copy()h,w=image.shape[:2]mask = np.zeros([h+2,w+2],np.uint8)cv2.floodFill(copyImg,mask,(30,30),(0,255,255),(100,100,100),(50,50,50),cv2.FLOODFILL_FIXED_RANGE)cv2.imshow("fill_color",copyImg)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
fill_color(src)cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下:
三、二值图像的泛洪填充
先创建一个全为0的400 * 400的黑色图像 , 取100 : 200 , 100 : 200 该区域赋值为255,白色。黑色背景有白色方块
创建402*402的掩膜全为1的图像,取101:201,101:201区域为0,黑色
想填充的区域设置为0,mask区域设置为1
cv2.floodFill(image,mask,(150,150),(0,0,255),cv2.FLOODFILL_MASK_ONLY)
将(150,150)周围的像素点相等的像素区域被(0,0,255)红色给填充
import cv2
import numpy as npdef fill_binary():image = np.zeros([400,400,3],np.uint8)image[100:200,100:200,:] = 255cv2.imshow("fill_binary_image",image)mask = np.ones([402,402],np.uint8)mask[101:201,101:201] = 0cv2.floodFill(image,mask,(150,150),(0,0,255),cv2.FLOODFILL_MASK_ONLY)cv2.imshow("fill_binary_mask",image)fill_binary()cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下: