欢迎来到军工软件开发人才培养基地——学到牛牛

ROI区域

时间:2024-05-06 07:01:10 来源:学到牛牛

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 包裹法和常量法