共计 1400 个字符,预计需要花费 4 分钟才能阅读完成。
图像指针
图像的基本元素就是所谓的像素,很多时候对于图像的处理在空间域中都是直接对像素做相应的处理。在本文中将以相关的例子来说明图像指针在图像处理中的实际应用。
图像颜色数目减法
对于一般的彩色图像来说分为三个颜色通道,以RGB图像举例说明包含R(红),G(绿),B(蓝)。(PS:在实际opencv读取rgb图像时保存的顺序是BGR)。对于每一个单通道像素值的大小可以使用无符号8位数值表示,也就是说其灰度的范围在0-255之间。
图像颜色数目的减法主要是在分析图像时存在一定的用途可以降低图像分析的复杂度。本文的例子主要包含内容:
假设将每个维度的颜色数降低为原来的1/8,那么得到的颜色数变为32*32*32,原始图像中每一个颜色都将替换为它所在格子的中间像素点的大小。
注意:上述不是简单的将原始图片每一格的其他非中心点的像素值替换为中心点的像素值,博主就是一开始误以为是这样操作导致自己在跑代码的时候发现实际处理的结果与问题描述的结果相差甚远。
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
// using .ptr and []
void colorReduce0(cv::Mat &image, int div=64) {
int nl= image.rows; // number of lines
int nc= image.cols * image.channels(); // total number of elements per line
for (int j=0; j<nl; j++) {
uchar* data= image.ptr<uchar>(j);
for (int i=0; i<nc; i++) {
// process each pixel ---------------------
data[i]= data[i]/div*div + div/2;
//data[i]= data[i/div*div + div/2];
// end of pixel processing ----------------
} // end of line
}
}
int main()
{
cv::Mat image1;
image1= cv::imread("boldt.jpg");
if (!image1.data)
return 0;
colorReduce(image1);
cv::namedWindow("helloworld");
cv::imshow("helloworld",image1);
cv::waitKey(0);
}
上述代码中使用的默认颜色缩放比例系数div=64。
代码解释:
data[i]= data[i]/div*div + div/2;
div表示颜色缩放系数,对于单通道而言将0-256灰度级分为了4个区间,data[i]/div是表示当前原图像素点落在哪一个区间当中,data[i]/div*div表示当前格子表示灰度级范围的左边缘最小值,后面加上div/2表示取当前格子中新店作为像素点灰度值大小,至此完成图像颜色数目的减少。
本文处理的原图像为:
采用本文的方法处理之后的结果为:
如果使用之前在注意里面描述的方法来做的话结果如下:
![实验结果2](http://7xifjo.com1.z0.glb.clouddn.com/结果1.jpg)
可见实验结果1与实验结果2之间的差距是相当大!