我正在阅读使用Harris Corner探测器在图像中找到角落的文档。我不明白为什么他们在应用Harris Corner功能后对图像进行了标准化。我对标准化的想法有点困惑。有人可以解释我为什么要将图像标准化?此外,convertscaleabs()做了什么。我仍然是opencv的首发,所以从文档中很难理解。
cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );
/// Normalizing
normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() ); //(I couldnot understand this line)
convertScaleAbs( dst_norm, dst_norm_scaled ); // ???
由于
答案 0 :(得分:4)
我建议您在深入了解OpenCV之前熟悉图像处理基础知识。拥有基本概念的坚实概念,如对比度,二值化,剪切,阈值,切片,直方图等(仅举几例)将使您在OpenCV中的旅程更加轻松。
也就是说,维基百科将其定义为:"规范化是一个改变像素强度值范围的过程......规范化有时被称为对比度拉伸或直方图拉伸"。
为了说明这个定义,我将尝试给你一个简单的例子:
想象一下,你有一个8位灰度图像,可能的像素强度值从0到255.如果图像有"低对比度",它的直方图将显示某个值周围的像素浓度,如你可以在下图中看到:
现在规范化的作用是"采取"这个直方图和拉伸它。它应用强度变换图,将原始最小和最大强度值与整个强度范围内的一对新的最小值和最大值相关联(0到255)。
至于convertScaleAbs()
,文档说明scales, calculates absolute values, and converts the result to 8-bit。没什么可说的。
完整原型是void convertScaleAbs(InputArray src, OutputArray dst, double alpha=1, double beta=0)
,因此使用它只会计算矩阵中每个元素的绝对值,并将其转换为有效的8位无符号值。
答案 1 :(得分:3)
您可能正在查看OpenCV tutorials的代码。
通过
对区间[0,255]中的角点响应(在某个未知区间内)进行标准化normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
更容易选择阈值(因为您现在知道阈值也将在区间[0,255]中)以保持最强的响应。在这种情况下,通过滑块获得阈值时,范围[0,255]非常有用,该滑块只能包含整数值。
convertScaleAbs(dst_norm, dst_norm_scaled);
仅需要将dst_norm
转换为Mat
类型的CV_8U
,因此imshow
可以正确显示它。