OpenCV笔记016————ROI of image

图像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));

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值