1. 程式人生 > >影象處理之簡化色彩(含OpenCV程式碼)

影象處理之簡化色彩(含OpenCV程式碼)

簡化色彩的用處:當待檢索的影象與影象庫中的影象在顏色撒謊能夠存在一定的色彩差異時,系統能自動忽略在一定範圍內的色彩差異,將在一定色彩差異範圍內的影象劃分為同一組,使其具有相同(相近)的特徵值。

可以將顏色減少為8種,15種,64種不同的等級。

經過灰度化,當前色彩是256級,即每一個畫素的值可能是0~255,經過簡化色彩後,影象的灰度級可固定在一個更小的範圍,如8級。





程式碼如下圖所示:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>

using namespace cv;

int main()
{
	Mat srcImage = imread("1.jpg");
	int mm=8, nn=8;//mm,nn為縮小後圖像的大小。
	int cc=64; //cc為影象簡化色彩後的灰度級數。

	int t[8 * 8];

	namedWindow("原圖");
	imshow("原圖", srcImage);

	cvtColor(srcImage, srcImage, CV_BGR2GRAY);	//影象化為灰度

	namedWindow("灰度原圖");
	imshow("灰度原圖", srcImage);

	cv::Size dsize = Size(mm, nn);
	cv::resize(srcImage, srcImage,dsize);

	namedWindow("灰度縮小");
	imshow("灰度縮小", srcImage);

	Mat Feature(mm, nn, CV_32SC1, Scalar::all(0));
	int i, j;
	int M = srcImage.rows;
	int N = srcImage.cols;

	for (i = 0; i<M; i++)
	for (j = 0; j<N; j++)
	{
		Feature.at<int>(i / (M / mm), j / (N / nn)) = Feature.at<int>(i / (M / mm), j / (N / nn)) + srcImage.at<uchar>(i, j);
		// Feature.at<uchar>(i/(M/8),j/(N/8))+=m.at<uchar>(i,j);
	}
	//測試:看看縮小後,影象裡面的每個畫素值是多少:
	
	for(i=0;i<mm;i++)
	for (j = 0; j < nn; j++)
		printf_s("縮小後,影象裡面的每個畫素值(%d,%d)%d   \n", mm, nn, Feature.at<int>(i, j));
	printf_s("end\n");
	

	
	//簡化色彩。當前灰度級為8位,即256色,將其處理為cc色。
	//這裡設定cc=64

	for (i = 0; i<mm; i++)
	for (j = 0; j<nn; j++)
		Feature.at<int>(i, j) /= (256 / cc);
	//測試:看看簡化色彩後,影象內裡面的每個畫素值是多少:
	
	for(i=0;i<mm;i++)
	for (j = 0; j < nn; j++)
		printf_s("簡化色彩後,影象內裡面的每個畫素值是多少(%d,%d):%d   \n", mm, nn, Feature.at<int>(i, j));
	
	//第3步:計算影象的平均值。
	double sum, aver;
	sum = 0;
	for (i = 0; i<mm; i++)
	for (j = 0; j<nn; j++)
		sum += Feature.at<int>(i, j);
	aver = sum / (mm*nn);
	printf_s("sum=%lf,aver=%lf",sum,aver);

	waitKey();
	return 0;
}
執行結果如下: