• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

Opencv学习笔记(1)–图像减法

C++ admin 4年前 (2015-05-30) 2820次浏览 0个评论 扫描二维码

图像指针

图像的基本元素就是所谓的像素,很多时候对于图像的处理在空间域中都是直接对像素做相应的处理。在本文中将以相关的例子来说明图像指针在图像处理中的实际应用。

图像颜色数目减法

对于一般的彩色图像来说分为三个颜色通道,以 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 之间的差距是相当大!


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Opencv 学习笔记(1)–图像减法
喜欢 (1)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!