ROI—(region of interest)—感兴趣区域 1 形状 一般为矩形区域 2 作用 能够确定分析重点,减少处理时间,增加精度 3 定义方法 使用Rect表示矩形区域或用Range设定行列范围
1.交通灯检测 只分析图片正上方的一部分区域 2.人脸识别 将处理范围缩小 3.车牌识别 减少误拍,提高处理的速度和精度
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);两种方式的运行结果完全相同。
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.运行结果
1.mask—(掩码) 一个8位单通道图像(灰度图/二值图) 2.操作方式 掩码某个位置如果为0,则在此位置上的操作不起作用 掩码某个位置如果不为0,则在此位置上的操作会起作用 3.作用 可以用来提取不规则ROI 4.图示
5.注意事项 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);三 运行结果
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,从而去除一些毛边; 阈值需要自己控制
代码
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);运行结果