調整圖像的灰度級數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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM