对图像部分区域进行处理再映射回原图

1. 将图像ROI区域利用copyTo复制到一张和原图相同大小的纯黑图片上并且位置与原图一致,这样进行处理后就可以直接将处理坐标用于原图上

  • 然而如博客所述处理后最外层轮廓被保留而这不是我们想要的
  • 查看findContours函数其中第三个参数mode可以设置轮廓检索模式
void cv::findContours	(	
InputArray 	image,
OutputArrayOfArrays 	contours,
OutputArray 	hierarchy,
int 	mode,
int 	method,
Point 	offset = Point() 
)	
  • mode可选参数如下:
参数含义
RETR_EXTERNAL只保留最外层轮廓,对于所有轮廓有hierarchy[i][2]=hierarchy[i][3]=-1
RETR_LIST检索所有轮廓且不为他们建立层次关系
RETR_CCOMP获取所有轮廓并且为他们建立一个两层的层次关系,最外层轮廓为顶级,第二层次为孔洞的边界,如果在孔洞里还有其他连通区域的轮廓则它也被置于顶层
RETR_TREE获取所有轮廓并且为他们建立完整嵌套层次关系
RETR_TREE
  • hierarchy [Next, Previous, First_Child, Parent]
  • hierarchy[i][0]~hierarchy[i][3]分别表示 后一个轮廓,前一个轮廓,内嵌子轮廓,父轮廓的索引编号,如果没有父轮廓或子轮廓则该值为-1
  • 当时想着刚好不要最外层轮廓也不需要包含在目标内的轮廓,刚好使用RETR_CCOMP不要顶层轮廓只取第二层轮廓就刚好是想要的结果,那么只需要取存在父轮廓的第二层轮廓即hierarchy[i][2]!=-1即可,下面是当时设置了findContours(bin, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, Point(0, 0));后hierarchy的参数结果
第 0 个轮廓 1 , -1 , -1 , -1
第 1 个轮廓 2 , 0 , -1 , -1
第 2 个轮廓 3 , 1 , -1 , -1
第 3 个轮廓 4 , 2 , -1 , -1
第 4 个轮廓 5 , 3 , -1 , -1
第 5 个轮廓 6 , 4 , -1 , -1
第 6 个轮廓 7 , 5 , -1 , -1
第 7 个轮廓 8 , 6 , -1 , -1
第 8 个轮廓 9 , 7 , -1 , -1
第 9 个轮廓 11 , 8 , 10 , -1
第 10 个轮廓 -1 , -1 , -1 , 9
第 11 个轮廓 12 , 9 , -1 , -1
第 12 个轮廓 13 , 11 , -1 , -1
第 13 个轮廓 14 , 12 , -1 , -1
第 14 个轮廓 15 , 13 , -1 , -1
第 15 个轮廓 16 , 14 , -1 , -1
第 16 个轮廓 17 , 15 , -1 , -1
第 17 个轮廓 18 , 16 , -1 , -1
第 18 个轮廓 19 , 17 , -1 , -1
第 19 个轮廓 20 , 18 , -1 , -1
第 20 个轮廓 21 , 19 , -1 , -1
第 21 个轮廓 22 , 20 , -1 , -1
第 22 个轮廓 23 , 21 , -1 , -1
第 23 个轮廓 24 , 22 , -1 , -1
第 24 个轮廓 25 , 23 , -1 , -1
第 25 个轮廓 26 , 24 , -1 , -1
第 26 个轮廓 27 , 25 , -1 , -1
第 27 个轮廓 28 , 26 , -1 , -1
第 28 个轮廓 29 , 27 , -1 , -1
第 29 个轮廓 30 , 28 , -1 , -1
第 30 个轮廓 31 , 29 , -1 , -1
第 31 个轮廓 32 , 30 , -1 , -1
第 32 个轮廓 -1 , 31 , -1 , -1
第 0 个轮廓 1 , -1 , -1 , -1
第 1 个轮廓 2 , 0 , -1 , -1
第 2 个轮廓 3 , 1 , -1 , -1
第 3 个轮廓 4 , 2 , -1 , -1
第 4 个轮廓 5 , 3 , -1 , -1
第 5 个轮廓 6 , 4 , -1 , -1
第 6 个轮廓 7 , 5 , -1 , -1
第 7 个轮廓 8 , 6 , -1 , -1
第 8 个轮廓 9 , 7 , -1 , -1
第 9 个轮廓 10 , 8 , -1 , -1
第 10 个轮廓 11 , 9 , -1 , -1
第 11 个轮廓 12 , 10 , -1 , -1
第 12 个轮廓 13 , 11 , -1 , -1
第 13 个轮廓 14 , 12 , -1 , -1
第 14 个轮廓 15 , 13 , -1 , -1
第 15 个轮廓 16 , 14 , -1 , -1
第 16 个轮廓 17 , 15 , -1 , -1
第 17 个轮廓 18 , 16 , -1 , -1
第 18 个轮廓 19 , 17 , -1 , -1
第 19 个轮廓 20 , 18 , -1 , -1
第 20 个轮廓 21 , 19 , -1 , -1
第 21 个轮廓 22 , 20 , -1 , -1
第 22 个轮廓 23 , 21 , -1 , -1
第 23 个轮廓 24 , 22 , -1 , -1
第 24 个轮廓 25 , 23 , -1 , -1
第 25 个轮廓 -1 , 24 , -1 , -1
  • 然而取了hierarchy[i][2]!=-1后仍然会保留最外层轮廓

2. 将ROI区域提取出来映射回原图时设置偏移量

  • API findContours()drawContours()的最后一个参数Point offset = Point()即是点的偏移量

  • 在ROI上findContours(),不用设置偏移量即最后一个参数不填或者设置为Point(0, 0)

  • 映射回原图时drawContours()的偏移量应为ROI区域左上角坐标在原图上的位置即为Point(boundRect[i].x, boundRect[i].y)

  • 或者利用rectangle画外接矩形映射回原图时,在左上角右下角坐标上都加上(偏移量ROI区域左上角坐标在原图上的位置),这样就能将对应的矩形框映射到原图的对应位置

rectangle(srcImage, 
Point(boundRect[i].x+boundRect1[i2].x, boundRect[i].y+boundRect1[i2].y), 
Point(boundRect[i].x+boundRect1[i2].x+boundRect1[i2].width, boundRect[i].y+boundRect1[i2].y+boundRect1[i2].height), 
Scalar(255,0,0), 2, 8, 0); //绘制第 i 个外接矩形
  • 一开始循环内的参数忘记更改导致全都画在了底部,后来也是左上角右下角坐标设置出错导致框特别大,全部更正好后画的框就可以映射回原图了
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 答1: 原图进行灰度线性变换后,直方图的主要变化是整体的亮度和对比度的调整,也就是说,灰度级之间的关系得到了改变,但是像素的数量分布没有变化,因此直方图的形状并没有发生改变。 而直方图均衡化则是通过调整像素数量分布来增强图像的对比度和细节。直方图均衡化的过程是将原始图像的直方图进行拉伸,使得像素值在整个灰度范围内均匀分布,从而增强图像的对比度。这样,直方图的形状会发生明显的变化,从原来的不均匀分布变为均匀分布,特别是在像素值集中分布的区域,直方图的峰值会下降,而在像素值稀疏分布的区域,直方图的峰值会上升。 ### 答2: 在数字图像处理中,原图进行灰度线性变换和直方图均衡化之后,直方图的变化有以下区别。 1. 灰度线性变换: 灰度线性变换是通过修改图像中每个像素的灰度值来调整图像的对比度和亮度。变换的过程中,直方图的整体形状保持不变,但仅仅在灰度级别上进行了线性的平移或缩放。因此,直方图的“山峰”位置可能会发生变化,但“山峰”的相对高低和形状不会改变。 2. 直方图均衡化: 直方图均衡化是通过对原图像的直方图进行重新分布来提高图像的对比度。在进行直方图均衡化后,原图像的低对比度区域的像素值会被拉伸,而高对比度区域的像素值会被压缩,从而使整幅图像的直方图更加均匀分布。因此,直方图均衡化后的直方图会变得更加平坦,直方图的动态范围会增加。 总结起来,通过灰度线性变换仅改变了直方图的位置,而保持了其形状和分布的相对关系。而直方图均衡化则更加重塑了直方图的整体形状,使得像素值的分布更加均匀,从而改善了图像的对比度。 ### 答3: 原图像经过灰度线性变换后,直方图的变化是将原图像的灰度级进行线性变换,即将原来的灰度级映射到新的灰度级范围内。灰度线性变换可以调整图像的对比度和亮度,使得图像在更广的灰度范围内展示,并且可以突出图像中的细节。 直方图均衡化是一种图像增强技术,它通过重新分配原图像像素的灰度值来增强图像的对比度。在直方图均衡化过程中,原图像的直方图被重新分布,使得直方图在整个灰度范围内均匀分布,从而使得图像的对比度增强。 因此,灰度线性变换和直方图均衡化后,直方图的变化区别在于灰度线性变换是简单的线性映射,直方图的形状基本保持不变,只是灰度级的范围发生了改变。而直方图均衡化则是将原图像的直方图均匀化,使得图像的对比度显著提高,直方图的形状发生了显著变化。 总之,灰度线性变换调整图像的对比度和亮度,直方图均衡化可以显著提高图像的对比度。灰度线性变换只改变了图像的灰度级范围,而直方图均衡化通过重新分布直方图,增强了图像的对比度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值