感兴趣区域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);
运行结果