python实现图片的ROI(region of interest)和泛洪填充
目录:
(一)ROI操作
(1)获取感兴趣区域
(2)还原操作
(二)泛洪填充floodFill
正文:
(一)ROI操作
感兴趣区(Region of Interest,ROIs) 是图像的一部分,
它通过在图像上选择或使用诸如设定阈值(thresholding) 或者从其他文件(如矢量> 转换获得等方法生成。
感趣区可以是点、线、面不规则的形状,通常用来作为图像分类的样本、掩膜、裁剪区或及其他操作。
原理通过操作图像矩阵来获取或合并指定位置的图像,
(1)获取感兴趣区域
1 src = cv.imread("./1.png") #读取图片 2 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应 3 cv.imshow("input image",src) #通过名字将图像和窗口联系 4 print(src.shape) 5 flower = src[200:400,100:250] 6 cv.imshow("flower",flower)
(2)还原操作
1 src = cv.imread("./1.png") #读取图片 2 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应 3 cv.imshow("input image",src) #通过名字将图像和窗口联系 4 print(src.shape) 5 flower = src[200:400,100:250] 6 cv.imshow("flower",flower) 7 gray = cv.cvtColor(flower,cv.COLOR_BGR2GRAY) #获取一张灰度图像,单一通道 8 backface = cv.cvtColor(gray,cv.COLOR_GRAY2BGR) #单一通道转3通道 9 src[200:400,100:250] = backface 10 cv.imshow("new image",src) 11 cv.waitKey(0) #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作 12 cv.destroyAllWindows() #销毁所有窗口
此时图片会失真,再如:
1 # -*- coding=GBK -*- 2 import cv2 as cv 3 import numpy as np 4 5 6 #截取图片中的指定区域或在指定区域添加某一图片 7 def jie_image(src1): 8 src2 = src1[5:89, 500:630]#截取第5行到89行的第500列到630列的区域 9 cv.imshow("截取", src2) 10 src1[105:189, 300:430] = src2#指定位置填充,大小要一样才能填充 11 cv.imshow("合成", src1) 12 13 src = cv.imread("C://1.jpg") 14 cv.imshow("原来", src) 15 jie_image(src) 16 cv.waitKey(0) 17 cv.destroyAllWindows()
(二)泛洪填充floodFill
1 def floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None): # real signature unknown; restored from __doc__
通俗解释:floodFill( 1.操作的图像, 2.掩模, 3.起始像素值,4.填充的颜色, 5.填充颜色的低值, 6.填充颜色的高值 ,7.填充的方法)
所谓的floodFill 漫水填充就是在一张图片中,和种子点像素相差在[-loDiff,+upDiff]的时候就用newVal来填充这个点。
1 1.操作的图像, 2 2.掩码, 3 3.起始像素值, #我们指定的第一个点的三个通道值 4 4.填充的颜色, 5 5.填充颜色的低值, #低值三通道 6 6.填充颜色的高值 , #高值三通道 7 7.填充的方法
1 参数5.填充颜色的低值就是:参数3的三通道值 减去 参数5
2 参数6.填充颜色的高值就是:参数3的三通道值 加上 参数6
1 7.填充的方法
2 彩色图像一般是FLOODFILL_FIXED_RANGE 指定颜色填充
4 还有一种是FLOODFILL_MASK_ONLY,mask的指定的位置为零时才填充,不为零不填充
(1)彩色图片
1 def fill_color_demo(image): 2 copyImg = image.copy() 3 h, w = image.shape[:2] 4 mask = np.zeros([h+2, w+2], np.uint8) 5 cv.floodFill(copyImg, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE) 6 cv.imshow("fill_color_demo", copyImg)
(2)二进制图片
FLOODFILL_MASK_ONLY我们可以自定义填充图像,掩码为1不填充,为0进行填充
1 def fill_binary(): 2 image = np.zeros([400,400,3],np.uint8) 3 image[100:300,100:300,:]=255 4 cv.imshow("fill_banary",image) 5 6 mask = np.ones([402,402,1],np.uint8) 7 mask[101:301,101:301] = 0 #这里设置需要加1--->101:301 这是我们填充的图像掩码为0 8 cv.floodFill(image,mask,(200,200),(0,255,0),cv.FLOODFILL_MASK_ONLY) #最好写到我们填充的图像中间 9 cv.imshow("fill_banary2",image)
1.操作的图像, 2.掩码, 为1不填充,为0才进行填充
3.填充图像的中央部分 4.填充的颜色,
5.填充的方法
参考:
https://www.cnblogs.com/ssyfj/p/9261056.html