在常见的计算机视觉问题中,通常我们只对图像中的某一部分区域感兴趣,比如人脸区域等,因此我们只需要对人脸区域部分进行提取,然后再进行后续的操作。
图像ROI兴趣区域
对于图像ROI区域,只需要将自己预先计算好的区域大概范围的图像值赋值给新的变量并显示即可。最方便的方式是使用Numpy来进行获取图像数组数据。
#8.1,图片ROI切割
import cv2 as cv
import numpy as np
def image_Clip(image):
#自己预先数好的大概位置范围
mask=image[30:160,100:240]
cv.namedWindow("mask",0)
cv.imshow("mask",mask)
cv.imshow("image",image)
src=cv.imread('F:\OutputResult\SrcImage\saber18.jpg')
print(src.shape)
image_Clip(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果:
漫水填充
#8.2,漫水填充floodfill函数
import cv2 as cv
import numpy as np
def floodFill_Demo(image):
#复制创建一个图像副本
print(image.shape)
copyImage=image.copy()
h,w=copyImage.shape[:2]
#此处注意掩膜的高宽要比原始图像多2,
#即上下左右各多一个像素大小,防止填充失败。
#注意:模板mask为单通道8位。
mask=np.zeros([h+2,w+2],image.dtype)
cv.floodFill(copyImage,mask,(30,30), (255,0, 255),(100, 100, 100), (50, 50, 50),cv.FLOODFILL_FIXED_RANGE)
cv.imshow("floodImage",copyImage)
src=cv.imread('F:\OutputResult\SrcImage\saber18.jpg')
floodFill_Demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
函数参数说明:
cv.floodFill(image, mask, seedPoint, newVal[, loDiff[, upDiff[, flags]]])
填充规则:
src(seed.x,seed.y)-loDiff<=src(x,y)<=src(seed.x,seed.y)+upDiff
上述案例:
(image,mask,(0,80), (22, 22, 222),(100, 100, 100), (50, 50, 100),cv.FLOODFILL_FIXED_RANGE)
image:图像输入/输出1或3通道、8位或浮点图像。
mask:填充模板,整体填充不能跨越输入遮罩中的非零像素。例如,边缘检测器输出可以用作遮罩,以停止边缘填充。输出时,像素
与图像中填充像素对应的遮罩设置为1或标志中指定的值。
seedPoint:参数种子点起始点。
newVal:重新绘制的域像素的新值。表示填充区域颜色
loDiff:(100, 100, 100)表示种子点位置的像素三通道的像素值减去该值,表示为低值
upDiff:(50, 50, 50)表示表示种子点位置的像素三通道的像素值加上该值,表示为高值
flags:参数标志操作标志。
cv.FLOODFILL_FIXED_RANGE:表示在该低值与高值范围内的全部填充为区域颜色。改变图像,漫水(泛洪)填充。
cv.FLOODFILL_MASK_ONLY:不改变图像,只填充模板本身,忽略新的颜色值参数。
只对模板区域填充
即修改flags参数:cv.FLOODFILL_MASK_ONLY
import cv2 as cv
import numpy as np
def fill_binary():
#创建一个三通道的图像值均为0
image=np.zeros([400,400,3],np.uint8)
#设置一个ROI区域大小,并将该区域的值设置为255
image[100:300,100:300,:]=255
cv.imshow("fill_binary",image)
h,w=image.shape[:2]
mask=np.zeros([h+2,w+2],np.uint8)
#设置填充区域的初始值
mask[101:301,101:301]=0
cv.floodFill(image,mask,(200,200),(255,0,255),cv.FLOODFILL_MASK_ONLY)
cv.imshow("filled_demo",image)
fill_binary()
cv.waitKey(0)
cv.destroyAllWindows()