要点
1.彩色图像灰度化
2.灰度直方图
3.灰度图像的伪彩图
1.彩色图像灰度化
一句opencv代码搞定,或者读入的图片以灰度图形式读入。
cv::imread("1.jpg",0);//以灰度图形式读入
2.灰度直方图以及灰度图像的伪彩图
灰度直方图:统计一幅图片中的灰度值分布
伪彩图:将特定值域的灰度值,映射成某一种颜色,设计单通道到三通道转换。
附上代码如下:
#include <opencv2\opencv.hpp>
#include <vector>
#include <iostream>
using namespace cv;
//#define uchar unsigned char
int main(int argc, char** argv)
{
Mat sourceImage = imread("1.jpg");
Mat processedImage;
cvtColor(sourceImage, processedImage, CV_RGB2GRAY);
Mat presudoColor(processedImage.rows, processedImage.cols, CV_8UC3);
//std::cout << processedImage << std::endl << std::endl;
imshow("origin", sourceImage);
imshow("processed", processedImage);
int channel = 0;
MatND dstHist;
int histSize[] = { 256 };
float range[] = { 0, 255 };
const float* ranges[] = { range };
calcHist(&processedImage, 1, &channel, Mat(), dstHist, 1, histSize, ranges, true, false);
Mat drawImage = Mat::zeros(Size(256, 512), CV_8UC1);
double g_dHistMaxValue;
minMaxLoc(dstHist, 0, &g_dHistMaxValue, 0, 0);
for (int i = 0; i < 256; i++)
{
int value = cvRound(dstHist.at<float>(i) *512 * 0.9 / g_dHistMaxValue);//同一个灰度值的像素可能非常的多,所以归一化放在窗口里
//int value = cvRound(dstHist.at<float>(i) );
line(drawImage, Point(i, drawImage.rows - 1), Point(i, drawImage.rows - 1 - value), Scalar(255,255,255));
}
imshow("final", drawImage);
int temp = 0;
for (int y = 0; y <presudoColor.rows; y++)
{
for (int x = 0; x < presudoColor.cols; x++)
{
temp = processedImage.at<uchar>(y, x);
if (temp < 85)
{
presudoColor.at<Vec3b>(y, x)[0] = 255;
presudoColor.at<Vec3b>(y, x)[1] = 0;
presudoColor.at<Vec3b>(y, x)[2] = 0;
}
else if (temp < 171)
{
presudoColor.at<Vec3b>(y, x)[0] = 0;
presudoColor.at<Vec3b>(y, x)[1] = 255;
presudoColor.at<Vec3b>(y, x)[2] = 0;
}
else if (temp < 256)
{
presudoColor.at<Vec3b>(y, x)[0] = 0;
presudoColor.at<Vec3b>(y, x)[1] = 0;
presudoColor.at<Vec3b>(y, x)[2] = 255;
}
else
throw;
}
}
imshow("presudoColor", presudoColor);
waitKey(0);
return 1;
}
最后华丽丽的给出结果图