当前位置:   article > 正文

图像的灰度级数越多越好_调整图像的灰度级数C++实现

图片灰度级数

图像灰度级数我们见得最多的就是256了,如果想调整它的灰度级数,我们可以使用图像库的imadjust函数来作出调整,比如讲256个灰度级变成2个灰度级(也就是二值图了)。再举一个例子,原来一幅256个灰度级的图像,如果我们把它的灰度级重新调整为4,那么调整后这幅图像的灰度值应该就是有4个值:0,85,170,255。即这幅图只能用这四个值来表示。那调整灰度级数的imadjust函数该怎么实现呢?

数字图像处理课刚好布置了一个作业,就是用代码实现灰度级调整。我在这里贴出我的代码,供大家参考参考。

说一说我的思路:比如一个灰度级256的图调整灰度为4,第一步我们就需要求出每个block的大小(也可以理解为256应该分为几个区间)。256 / (4-1) = 3个区间,每个区间size是85。然后我们再求出每个区间的中值,如果原图pixel值比这个中间值大,那他就属于这个区间的最大值,否则它就是属于上一个区间的最大值。

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include

using namespace std;

void quantizie(cv::Mat& input_img, int level);

#define LEVEL 2

int main()

{

cv::Mat img = cv::imread("41.png", 0);

cv::imshow("src", img);

quantizie(img, LEVEL);

return 0;

}

uchar get_value(int level, uchar v)

{

int block_num = level - 1;

int block_size = 256 / block_num;

for (int i = 1; i <= block_num; i++)

{

if (v > block_size * i)

{

continue;

}

int mid_value = block_size * i / 2;

int left = block_size * (i - 1);

int right = block_size * i - 1;

if (v < mid_value)

{

return left;

}

else

{

return right;

}

}

return v;

}

void quantizie(cv::Mat& input_img, int level)

{

cv::Mat output_img = input_img.clone();

output_img.setTo(0);

for (int i = 0; i < output_img.rows; i++)

{

uchar* p1 = input_img.ptr(i);

uchar* p2 = output_img.ptr(i);

for (int j = 0; j < output_img.cols; j++)

{

p2[j] = get_value(level, p1[j]);

//p2[j] = (p1[j] / range) * range;

}

}

cv::imshow("quantize", output_img);

cv::imwrite("quantize.png", output_img);

cv::waitKey();

}

灰度级256

灰度级128

灰度级32

灰度级8

灰度级4

灰度级2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/46722
推荐阅读
相关标签
  

闽ICP备14008679号