OpenCV---ROI(region of interest)和泛洪填充
一:ROI
感兴趣区(Region of Interest,ROIs) 是图像的一部分,
它通过在图像上选择或使用诸如设定阈值(thresholding) 或者从其他文件(如矢量> 转换获得等方法生成。
感趣区可以是点、线、面不规则的形状,通常用来作为图像分类的样本、掩膜、裁剪区或及其他操作。
(一)获取感兴趣区域
src = cv.imread("./1.png") #读取图片 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应 cv.imshow("input image",src) #通过名字将图像和窗口联系 print(src.shape) flower = src[200:400,100:250] cv.imshow("flower",flower)
原图:
感兴趣区域:
还原操作:
src = cv.imread("./1.png") #读取图片 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应 cv.imshow("input image",src) #通过名字将图像和窗口联系 print(src.shape) flower = src[200:400,100:250] cv.imshow("flower",flower) gray = cv.cvtColor(flower,cv.COLOR_BGR2GRAY) #获取一张灰度图像,单一通道 backface = cv.cvtColor(gray,cv.COLOR_GRAY2BGR) #单一通道转3通道 src[200:400,100:250] = backface cv.imshow("new image",src) cv.waitKey(0) #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作 cv.destroyAllWindows() #销毁所有窗口
二:泛洪填充floodFill
推文:图像处理------泛洪填充算法(Flood Fill Algorithm) 油漆桶功能
(一)
所谓的floodFill 漫水填充就是在一张图片中,和种子点像素相差在[-loDiff,+upDiff]的时候就用newVal来填充这个点。
def floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None): # real signature unknown; restored from __doc__
1.操作的图像, 2.掩码, 3.起始像素值, #我们指定的第一个点的三个通道值 4.填充的颜色, 5.填充颜色的低值, #低值三通道 6.填充颜色的高值 , #高值三通道 7.填充的方法
参数5.填充颜色的低值就是:参数3的三通道值 减去 参数5
参数6.填充颜色的高值就是:参数3的三通道值 加上 参数6
7.填充的方法 彩色图像一般是FLOODFILL_FIXED_RANGE 指定颜色填充 还有一种是FLOODFILL_MASK_ONLY,mask的指定的位置为零时才填充,不为零不填充
def fill_color_demo(image): copyImg = image.copy() #从源图像上克隆出一张新图像 h,w = image.shape[:2] mask = np.zeros([h+2,w+2],np.uint8) #+2是为了使边缘像素也被修改 print(image[30,30]) #[187 192 191] 用它进行操作的 cv.floodFill(copyImg,mask,(30,30),(0,255,255),(50,50,50),(50,50,50),cv.FLOODFILL_FIXED_RANGE) cv.imshow("fill_color_demo",copyImg)
src = cv.imread("./1.png") #读取图片 fill_color_demo(src)
(二)FLOODFILL_MASK_ONLY我们可以自定义填充图像,掩码为1不填充,为0进行填充
def fill_binary(): image = np.zeros([400,400,3],np.uint8) image[100:300,100:300,:]=255 cv.imshow("fill_banary",image) mask = np.ones([402,402,1],np.uint8) mask[101:301,101:301] = 0 #这里设置需要加1--->101:301 这是我们填充的图像掩码为0 cv.floodFill(image,mask,(200,200),(0,255,0),cv.FLOODFILL_MASK_ONLY) #最好写到我们填充的图像中间 cv.imshow("fill_banary2",image)
fill_binary()
1.操作的图像, 2.掩码, 为1不填充,为0才进行填充
3.填充图像的中央部分 4.填充的颜色, 5.填充的方法