圖像灰度級數我們見得最多的就是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