ROI(Range Of Interest)与泛洪填充
python+opencv3.3视频教学 基础入门笔记(贾志刚老师)
https://www.bilibili.com/video/av24998616/?p=8
ROI(Range Of Interest 感兴趣区域)
numpy获取ROI 指定宽高的起始结束位置
src1 = cv.imread('1.jpg') # cv.namedWindow('src1',cv.WINDOW_AUTOSIZE) cv.imshow('src1',src1) face = src1[180:335 ,470:570] #row-指定高范围180px-335px width-指定宽范围470px-570px gray = cv.cvtColor(face,cv.COLOR_BGR2GRAY) #将face一块的图像转为灰度图(单通道) backface = cv.cvtColor(gray,cv.COLOR_GRAY2BGR) #再将灰度图转为BRG图(3通道) src1[180:335 ,470:570] = backface cv.imshow('face',src1) print(src1.shape)
泛洪填充(漫水填充)
是一种用特定的颜色填充联通区域的方法,通过设置可连通像素的上下限以及连通方式来达到不同的填充效果的方法。
泛洪填充经常被用来标记或分离图像的一部分以便对其进行进一步处理或分析,也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或只处理掩码指定的像素点,操作的结果总是某个连续的区域。
def fill_color_demo(img): copyImg = img.copy() h,w = copyImg.shape[:2] #记住:遮罩mask 要在img的h w 之上加2,基于opencv扫描算法 ##mask必须行和列都加2,且必须为uint8单通道阵列---当从0行0列开始泛洪填充扫描时,mask多出来的2可以保证扫描的边界上的像素都会被处理 mask = np.zeros([h+2,w+2],np.uint8) #floodFill(image, mask, seedPoint, newVal, flags=None) #种子点(200,500)、填充颜色(0,255,255)、填充区域最低(170,320,100) 最高范围(360,580,30) cv.floodFill(copyImg,mask,(256,256),(0,0,255),(100,100,100),(50,50,50),cv.FLOODFILL_FIXED_RANGE) cv.imshow('fill_color_demo',copyImg)
cv.floodFill(image, mask, (430, 430), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE) -> retval, image, mask, rect
cv.floodFill(image, mask, (200, 200), (100, 2, 255), cv.FLOODFILL_MASK_ONLY)
以上两个函数的前三个参数:
1-image:为需要进行洪泛处理的图片;
2-mask:表示为掩图,其作用见对上述矩形的处理;
3-(430, 430)或(200, 200):表示种子数据,即选中的像素点位置;
4-(0, 255, 255)或(100, 2, 255):表示填充的颜色;
5-(100, 100, 100)与 (50, 50, 50):表示低、高的三通道范围。例如第一个函数中, (430, 430)这个位置的像素点(x,y,z),即像素范围在(x-100,y-100,z-100)到(x+50,y+50,z+50)全部被填充。
6-cv.FLOODFILL_FIXED_RANGE:泛洪填充,改变图像;
cv.FLOODFILL_MASK_ONLY:不改变图像,只填充掩遮罩本身。
def fill_binary(): image = np.zeros([400,400,3],np.uint8) image[100:300,100:300,:] = 255 #高100-300 宽100-300 区域的3个通道BRG设置为255 cv.imshow('before_fill_binary',image) mask = np.ones([402,402,1],np.uint8) mask[101:301,101:301] = 0 cv.floodFill(image,mask,(200,200),(0,0,255),loDiff=cv.FLOODFILL_MASK_ONLY) cv.imshow('after_filled_binary',image)
注意:
1.个人认为,不管是FLOODFILL_FIXED_RANGE还是FLOODFILL_MASK_ONLY操作,泛洪填充都不会填充掩膜mask的非零像素区域
2. mask[101:301, 101:301] = 0 这条语句为什么是101:301而不是100:300呢?我觉得应该是掩膜mask是比原图像左右上下都多了1,所以掩膜mask左右一共比原图像多2,上下也比原图像多2。
那么原图像的100就自然对应到掩膜的101,同样原图像的300就自然对应到掩膜的301。
3.当FLOODFILL_MASK_ONLY设置了的时候,原图不会改变,只会用中间八位的值填充mask。 floodFill的flags参数的中间八位的值就是用于指定填充掩码图像的值的,但是如果flags中间八位的值为0,则掩码会用1来填充。