图像处理之其他杂项 小知识点汇总
1.像素读取 来自于:C++下的OpenCV中Mat类型存储的图像格式
使用at
方式进行访问,在at
的时候需要指定的数据类型对照表如下:
种类 | C1 | C2 | C3 | C4 | C6 |
---|---|---|---|---|---|
uchar 8U |
uchar |
cv::Vec2b |
cv::Vec3b |
cv::Vec4b |
|
char 8S |
|||||
ushort 16U |
|||||
short 16S |
short |
cv::Vec2s |
cv::Vec3s |
cv::Vec4s |
|
int 32S |
int |
cv::Vec2i |
cv::Vec3i |
cv::Vec4i |
|
float 32F |
float |
cv::Vec2f |
cv::Vec3f |
cv::Vec4f |
cv::Vec6f |
double 64F |
double |
cv::Vec2d |
cv::Vec3d |
cv::Vec4d |
cv::Vec6d |
2.类型转换 convertTo中使用相关知识。。来自于:opencv中类型转换问题
在学习立体匹配算法中BM算法时,出现在了关于类型转换的问题 :disp.convertTo(disp8u, CV_8U, 255 / (numberOfDisparities*16.))
255(numberOfDisparities*16.))
不知道为什么做此转换,经过资料的查阅,终于解惑啦!
在opencv中,如果是float形式,如果用imshow函数显示,只会显示像素值在0.0-1.0之间的,如果像素值大于1.0会显示为白像素,小于0.0显示为黑。为了可视化float形式的图像。可以将它的值归一化到0-1;
同理,如果用convertTo函数(src.convertTo(dst, type, scale, shift)创建指定类型的矩阵,当值超过显示范围时,则将它限制为最大值或者最小值。
所以当目标数据类型为cv_8U时,需要将值图像的像素值约束在0-255之间,所以就靠scale和shift来做缩放,假设矩阵A的最大值为max最小值为min,则
if (Min!=Max){
A -= Min;
A.convertTo(B,CV_8U,255.0/(Max-Min));
}
所以本段代码中,disp为视差图,最小视差默认为0,numberOfDisparities为最大视差与最小视差的差值,除以16则是根据邹老师的说法,得到的结果是CV_16S,需要除以16才能得到正确的视差值。
3.RGB图转灰度图 来自于:瞎搞系列-边缘检测
边缘检测是基于对图像灰度差异运算而实现的,如果输入的是RGB,则需要先进行灰度图变换。RGB转灰度图的一个常用公式为:
Gray = R*0.299 + G*0.587 + B*0.114。
4.图像频谱表示 来自于:理解图像中的低频分量和高频分量
总得来说,低频分量(低频信号)代表着图像中亮度或者灰度值变化缓慢的区域,也就是图像中大片平坦的区域,描述了图像的主要部分。高频分量(高频信号)对应着图像变化剧烈的部分,也就是图像的边缘(轮廓)或者噪声以及细节部分。
之所以说噪声也对应着高频分量,是因为图像噪声在大部分情况下都是高频的。
低频分量:主要对整幅图像强度的综合度量。高频分量:主要是对图像边缘和轮廓的度量。而人眼对高频分量比较敏感。
我们试着用傅立叶变换站在另外一个角度观察图像,将图像从灰度分布转化到频率分布(频谱图)上去观察图像的特征。需要了解的是,图像进行二维傅立叶变换之后得到的频谱图,就是图像梯度的分布图。具体的,傅立叶频谱图上我们能看到明暗不一的亮点,实际是图像上某一点与邻域点差异的强弱,即梯度的大小。
所以说,如果一幅图像的各个位置的强度大小相等,则图像只存在低频分量。从图像的频谱图上看,只有一个主峰,且位于频率为零的位置.。需要提一句的是,图像的频谱图可以由傅里叶变换得到。
如果一幅图像的各个位置的强度变化剧烈,则图像不仅存在低频分量,同时也存在多种高频分量。从图像的频谱上看,不仅有一个主峰,同时也存在多个旁峰。可以这样理解:图像中的低频分量就是图像中梯度较小的部分,高频分量则相反。
从直方图上看,低频分量对应直方图内大块区域,而小块或者离散的区域就是高频分量。这说明低频分量占据了图像的主要部分。
从二维函数上理解,变化剧烈的地方就是高频分量,变化少的地方就是低频分量。