zoukankan      html  css  js  c++  java
  • 调整图像的灰度级数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

  • 相关阅读:
    对象,类,封装,继承,多态是什么
    面向对象和非面向对象程序的区别是什么?
    什么是OOA,OOP
    git stash git tag
    从一个远程仓库同步向另一个远程仓库同步代码
    VScode 配置rust开发环境
    IAR ICCARM V8.32.3在Windows Server端进行Ollydbg破解
    阅读笔记
    FP32转FP16能否加速libtorch调用
    阅读笔记-Chained-Tracker
  • 原文地址:https://www.cnblogs.com/skyfsm/p/7586836.html
Copyright © 2011-2022 走看看