调整图像的灰度级数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 <iostream>
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<uchar>(i);
uchar* p2 = output_img.ptr<uchar>(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
分类:
数字图像处理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?