opencv(11)---ROI与mask图像

本文介绍了在图像处理中如何使用感兴趣区域(ROI)和掩码(Mask)技术来提高处理效率和精度。通过具体的代码示例,展示了如何提取特定区域、实现图像融合,并利用掩码进行高级图像处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感兴趣区域ROI

基本概念

ROI—(region of interest)—感兴趣区域
1 形状
一般为矩形区域
2 作用
能够确定分析重点,减少处理时间,增加精度
3 定义方法
使用Rect表示矩形区域或用Range设定行列范围

作用

1.交通灯检测
这里写图片描述
只分析图片正上方的一部分区域
2.人脸识别
这里写图片描述
将处理范围缩小
3.车牌识别
这里写图片描述
减少误拍,提高处理的速度和精度

代码1- - -提取感兴趣区域

1.代码

   Mat img=imread("1.png");
    if(img.empty()){
        cout<<"no data read!"<<endl;
        return ;
    }

    //1.Rect方法进行定义
    Mat imgROI=img(Rect(20,20,100,200));

    //2.Range方法显示
    //Mat imgROI=img(Range(20,220),Range(20,120));

    imwrite("imgROI.jpg",imgROI);

2.知识点讲解

有两种方式来获取一副图像中的感兴趣区域。

1)使用Rect方式进行定义

 Mat imgROI=img(Rect(20,20,100,200));

2)使用Range方式进行定义

 Mat imgROI=img(Range(20,220),Range(20,120);

两种方式的运行结果完全相同。

代码2- - -初级图像融合

1. 代码

Mat img=imread("1.jpg");
Mat logo=imread("opencv.jpg");
Mat imgROI=img(Rect(20,20,logo.cols,logo.rows));
//imgROI=img(Range(20,20+logo.rows),Range(20,20+logo.cols));
logo.copyTo(imgROI);
imshow("imgROI",img);

2.知识点讲解

logo.copyTo(imgROI);

将logo这幅图片复制到imgROI上,这时,img图片就被污染了

3.运行结果
这里写图片描述

mask掩码

基本概念

1.mask—(掩码)
一个8位单通道图像(灰度图/二值图)
2.操作方式
掩码某个位置如果为0,则在此位置上的操作不起作用
掩码某个位置如果不为0,则在此位置上的操作会起作用
3.作用
可以用来提取不规则ROI
4.图示
这里写图片描述

5.注意事项
mask图像的大小必须和原图相同;
需要将mask图像设置为二值图

制作mask图像

一 制作步骤

设需要为lena.jpg制作掩码图像
1.复制lena.jpg图像,重命名为mask.jpg
2.以绘图方式打开mask.jpg图像
3. 将mask.jpg整幅图像设置为黑色,自己感兴趣的区域填充为白色,保存即可。

二 代码

Mat img=imread("1.jpg");
Mat logo=imread("lena.jpg");

/*直接采用图像来设置掩码*/
//0 采用灰度模式
Mat mask=imread("mask.jpg",0);
Mat imgROI=img(Rect(20,20,logo.cols,logo.rows));
logo.copyTo(imgROI,mask);

imshow("imgROI",img);

三 运行结果

这里写图片描述

使用代码来制作二值mask图像(推荐)

1.代码

Mat img=imread("1.jpg");
Mat logo=imread("lena.jpg");


//1.先创建一个纯黑的图像   CV_8UC1说明创建的图像为二值图
Mat mask=Mat::zeros(logo.size(),CV_8UC1);
//2.创建一个圆形区域   具体circle函数参见原先的总结
circle(mask,Point(mask.rows/2,mask.cols/2),100,Scalar(255),-1,8);
Mat imgROI=img(Rect(20,20,logo.cols,logo.rows));
logo.copyTo(imgROI,mask);
imshow("imgROI",img);

2.运行结果

这里写图片描述

高级图像融合

代码

Mat img=imread("1.jpg");
Mat logo=imread("opencv.jpg");
Mat mask=imread("opencv.jpg",0);

//1.图像取反---图像的基本运算比较重要  逻辑取反
bitwise_not(mask,mask);
//2.二值化---注意控制阈值
threshold(mask,mask,100,255,THRESH_BINARY);

Mat imgROI=img(Rect(20,20,logo.cols,logo.rows));
logo.copyTo(imgROI,mask);
imshow("imgROI",img);

运行结果
这里写图片描述

知识点
1.图像的基本运算的应用

//1.图像取反---图像的基本运算比较重要  逻辑取反
bitwise_not(mask,mask); 

这段代码可以将原先的图像像素进行取反。
使得原先为白色的位置,经过逻辑取反后,值为0;
原图不为白色的位置,经过逻辑取反后,值不为0.
从而决定mask图像起作用的位置
2.图像阈值化后以二值图像设置

//2.二值化---注意控制阈值
threshold(mask,mask,100,255,THRESH_BINARY);

可以设置低于某个像素值的值为0,从而去除一些毛边;
阈值需要自己控制

6. 图像基本运算与mask图像

代码

Mat img1=imread("D:\\1\\48.png");
Mat img2=imread("D:\\1\\99.png");
Mat mask=Mat::zeros(img1.size(),CV_8UC1);
circle(mask,Point(img1.rows/2,img1.cols/2),100,Scalar(255),-1,8);
Mat dst=img2.clone();
//设置掩码后,只有设置掩码的部分起作用;其它部分不起作用,和掩码图像相同
add(img1,img2,dst,mask);
imshow("dst",dst);

运行结果
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值