1、ROI简介
ROI既是提取感兴趣的区域。在图像处理中,我们常常要对某个区域进行选择、提取,然后对这个区域进行单独分析、处理、显示,这个的区域我们称为ROI区域,英文全称为Region of interest,中文名为“感兴趣区域”。
1.1 截取感兴趣区域
newImg = img[0: 100, 0: 100]
获取指定区域的图像,将结果生成新的newImg图像对象。以下示例从img图像对象中截取部分区域生成新的图像。
# 获取感兴趣的区域(ROI)
import cv2
img = cv2.imread(filename="E:/tmp/img/cat.png")
# 获取高、宽
h, w = img.shape[:2]
# 获取指定范围图像
newImg = img[100: h-100, 0: w-10]
cv2.imshow("newImg", newImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2 颜色通道提取
ROI操作中提供一系列的函数操作各通道。
cv2.split(img):用于拆分指定图像对象的通道。
cv2.merge((b, g, r)):组合指定BGR通道。
img.copy():复制图像对象。
案例1:单独设置通道值
# 获取感兴趣的区域(ROI)
import cv2
img = cv2.imread(filename="img/cb.jpg")
# 1、split()函数用于拆分通道,从而获取B、G、R通道的矩阵
b, g, r = cv2.split(m=img)
# 剔除B通道,将该通道中的值均改为0
b[:, :] = 0
# 2、merge()函数用于组合多个通道
img2 = cv2.merge(mv=(b, g, r))
cv2.imshow(winname="test", mat=img2)
cv2.waitKey(0)
cv2.destroyWindow()
案例2:设置指定通道值
import cv2
img = cv2.imread(filename="img/cb.jpg")
# 通过通道下标设置指定通道值。
# 前两个“:”表示图像的形态;最后一个参数为“:”表示针对所有通道、0表示B、1表示G、2表示R
img[:, :, 1] = 255
# 限定指定的范围,修改B通道的值;其中100:250表示高,200:300表示宽
# img[100:250, 200:300, 0] = 255
cv2.imshow(winname="test", mat=img)
cv2.waitKey(0)
cv2.destroyWindow()
运行结果:
2、边界填充
如果您想给自己的图片设置边界框,就像一个相框一样,就可以使用cv2.copyMakeBorder()函数为图像对象设置边界。语法格式如下。
cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value=None)
src:图像对象;
top:图像顶部边框宽度;
bottom:图像底部边框宽度;
left:图像左边边框宽度;
right:图像右边边框宽度;
borderType:边框填充的类型,有以下常用方法。
cv2.BORDER_REPLICATE:复制法,复制最边缘像素填充边界(即将边缘像素进行拉伸填充)。
cv2.BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行镜像复制。例如:cba|abcdefg|gfe。
cv2.BORDER_WRAP:外包装法,使用图像平铺边界。
cv2.BORDER_CONSTANT:常量法,以常量数值填充边界,需使用value参数设置常量值,例如:value=(21, 255, 252)
各类型方法应用示例如下。
import cv2
img = cv2.imread("E:/tmp/img/cat.png")
# 定义需要填充的边界
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)
# 复制法
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
# 反射法
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT)
# 包裹法
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
# 常量填充法
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_CONSTANT, value=(21, 255, 252))
cv2.imshow("replicate", replicate)
cv2.imshow("reflect", reflect)
cv2.imshow("wrap", wrap)
cv2.imshow("constant", constant)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下。
图2.1 复制法和反射法
图2.2 包裹法和常量法