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

来源:互联网 发布:大学生程序员如何赚钱 编辑:程序博客网 时间:2024/05/24 06:30

感兴趣区域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);

运行结果
这里写图片描述

0 0
原创粉丝点击