图像ROI与ROI操作
ROI of image代码注释:
import cv2 as cv
import numpy as np
src = cv.imread("dataset/train/bees/1.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
h, w = src.shape[:2]
# image.shape属性是一个tuple元组(高,宽,位深)
# img.shape[:2] 取彩色图片的长、宽。
# 如果img.shape[:3] 则取彩色图片的长、宽、通道。
# 关于img.shape[0]、[1]、[2]
# img.shape[0]:图像的垂直尺寸(高度)
# img.shape[1]:图像的水平尺寸(宽度)
# img.shape[2]:图像的通道数
# 在矩阵中,[0]就表示行数,[1]则表示列数。
# 拓展:
# print(type(img)) #显示类型 <class 'numpy.ndarray'>
# print(img.shape) #显示尺寸 (300, 451, 3)
# print(img.shape[0]) #图片宽度 300
# print(img.shape[1]) #图片高度 451
# print(img.shape[2]) #图片通道数 3
# print(img.size) #显示总像素个数 405900
# print(img.max()) #最大像素值 231
# print(img.min()) #最小像素值 0
# print(img.mean()) #像素平均值 115.305141661
# 获取ROI
cy = h//2
cx = w//2
roi = src[cy-100:cy+100,cx-100:cx+100,:]
cv.imshow("roi", roi)
# copy ROI
image = np.copy(roi)
# modify ROI
roi[:, :, 0] = 0
cv.imshow("result", src)
# modify copy roi
image[:, :, 2] = 0
cv.imshow("result", src)
cv.imshow("copy roi", image)
# example with ROI - generate mask
src2 = cv.imread("dataset/train/bees/1.png")
cv.imshow("src2", src2)
hsv = cv.cvtColor(src2, cv.COLOR_BGR2HSV)
mask = cv.inRange(hsv, (26, 43, 0), (34, 255, 46))
#把蜜蜂选出来
# extract person ROI
mask = cv.bitwise_not(mask)#除去蜜蜂后的背景图
person = cv.bitwise_and(src2, src2, mask=mask)
# bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
# bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
# bitwise_xor是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,1^1=0,1^0=1,0^1=1,0^0=0
# bitwise_not是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1
# generate background
result = np.zeros(src2.shape, src2.dtype)
result[:,:,0] = 255
# combine background + person
mask = cv.bitwise_not(mask)
dst = cv.bitwise_or(person, result, mask=mask)
dst = cv.add(dst, person)
cv.imshow("dst", dst)
cv.waitKey(0)
cv.destroyAllWindows()
结果:
总结
1.定义
ROI(region of interest),也就是感兴趣区域,如果你设置了图像了ROI,那么在使用OpenCV的函数的时候,会只对ROI区域操作,其他区域忽略。举个例子:
现在要将这幅图的蓝色通道加150,如果没有设置ROI,则函数作用在这个图像上,整个图像的所有像素的蓝色通道都会被加上150
但是现在我设置了ROI,Rect ROI(0,100,width/2,height/2);
则函数只会作用在我设置的ROI区域,其他区域保持不变。效果如下图
2. 图像ROI操作
1 、使用Rect函数
cv::Rect 表示一个矩形区域,常用的构造函数如下:
Rect_(
_Tp _x, //左上角的坐标值x
_Tp _y, //左上角的坐标值y
_Tp _width, //所选区域的宽
_Tp _height //所选区域的高
);
例子:
//创建宽度为320,高度240的3通道图像img
Mat img(Size(320,240),CV_8UC3);
//提取img中Rect(10,10,100,100)感兴趣区域,宽和高都是100
Mat roi(img,Rect(10,10,100,100));
2 、使用Range
cv::Range是指感兴趣区域的行和列的范围
cv::Range(
Range(row1,row10), //起始索引
Range(cols1,cols10) //终止索引
)
是指从起始索引到终止索引(不包括终止索引)的一段连续的序列。
例子:
Mat roi(img,Range(10,100),Range(10,100));