1,ROI
感兴趣区(Region of Interest,ROI) 是图像的一部分,它通过在图像上选择或使用诸如设定阈值(thresholding) 或者从其他文件(如矢量> 转换获得等方法生成。机器视觉、图像处理中,感趣区可以是从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,通常用来作为图像分类的样本、掩膜、裁剪区或及其他操作。
源代码:
import cv2 as cv
import numpy as np
src = cv.imread("F:/images/lena.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
ROI = src[50:250, 100:300] #假设我们对她的帽子感兴趣,指定宽高的区域
gray = cv.cvtColor(ROI, cv.COLOR_BGR2GRAY) #转换成灰度图
backROI = cv.cvtColor(gray, cv.COLOR_GRAY2BGR) #还原为RGB图
src[50:250, 100:300] = backROI #重新置在原图中(ROI操作)
cv.imshow("hat", src)
cv.waitKey(0)
cv.destroyAllWindows()
2,泛洪填充算法(Flood Fill Algorithm)
泛洪填充算法又称洪水填充算法,是在很多图形绘制软件中常用的填充算法,最熟悉不过就是windows paint的油漆桶功能。算法的原理很简单,就是从一个点开始附近像素点,填充成新的颜色,直到封闭区域内的所有像素点都被填充新颜色为止。泛红填充实现最常见有四邻域像素填充法,八邻域像素填充法,基于扫描线的像素填充方法。根据实现又可以分为递归与非递归(基于栈)。所谓的floodFill 漫水填充就是在一张图片中,和种子点像素相差在[-loDiff,+upDiff]的时候就用newVal来填充这个点。
def floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None):
1.操作的图像,
2.掩码,
3.起始像素值, #我们指定的第一个点的三个通道值
4.填充的颜色,
5.填充颜色的低值, 参数3的三通道值 减去 参数5 #低值三通道
6.填充颜色的高值 , 参数3的三通道值 加上 参数6 #高值三通道
7.填充的方法 #彩色图像一般是FLOODFILL_FIXED_RANGE 指定颜色填充;还有一种是FLOODFILL_MASK_ONLY,mask的指定的位置为零时才填充,不为零不填充
源代码:
import cv2 as cv
import numpy as np
def fill_color_demo(image):
copyImg = image.copy() #拷贝原图像
h, w = image.shape[:2] #返回高和宽
mask = np.zeros([h+2, w+2], np.uint8) #+2是为了使边缘像素也被修改
cv.floodFill(copyImg, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
cv.imshow("fill_color_demo", copyImg)
def fill_binary():
image = np.zeros([400, 400, 3], np.uint8)
image[100:300, 100:300, : ] = 255
cv.imshow("fill_binary", image)
mask = np.ones([402, 402, 1], np.uint8) #为1不填充,为0才进行填充,默认mask是单通道的,通道数1可写可不写
mask[101:301, 101:301] = 0 #加一的原因是mask[h+2,w+2],imge原来的ROI区域对应的是mask[+1,+1]的区域
cv.floodFill(image, mask, (200, 200), (100, 2, 255), cv.FLOODFILL_MASK_ONLY) # 最好写到我们填充的图像中间
cv.imshow("filled binary", image)
src = cv.imread("F:/images/lena.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
fill_color_demo(src)
fill_binary()
cv.waitKey(0)
cv.destroyAllWindows()