调整图像的灰度级数C++实现

本文介绍了一种使用C++和OpenCV实现图像灰度级调整的方法。通过将256个灰度级转换为较少数量的灰度级,如4个或2个,实现了图像的简化。文中提供了一个具体的代码实例,展示了如何计算新的灰度值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图像灰度级数我们见得最多的就是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

1093303-20170924120901415-1682497583.png

灰度级128

1093303-20170924120915368-73813052.png

灰度级32

1093303-20170924120931196-246953885.png

灰度级8

1093303-20170924120945290-1916253058.png

灰度级4

1093303-20170924121005868-1821428617.png

灰度级2
1093303-20170924121019696-1517083968.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值