直方图均衡化
#include "opencv2/opencv.hpp"
using namespace cv;
int main()
{
// 图像源获取及判断
cv::Mat Image, ImageGray;
Image = cv::imread("images/B.jpg");
if(Image.empty())
return -1;
cv::imshow("Image",Image);
// 转换为灰度图像
cv::cvtColor(Image,ImageGray,CV_BGR2GRAY);
// 定义直方图参数
const int channels[1]={0};
const int histSize[1]={256};
float pranges[2]={0,255};
const float* ranges[1]={pranges};
cv::MatND hist;
// 计算直方图
cv::calcHist(&ImageGray,1,channels,cv::Mat(),hist,1,
histSize,ranges);
// 初始化画布参数
int hist_w = 500;
int hist_h = 500;
int nHistSize = 255;
// 区间
int bin_w = cvRound( (double) hist_w / nHistSize );
cv::Mat histImage( hist_w, hist_h,
CV_8UC3, cv::Scalar( 0,0,0) );
// 将直方图归一化到范围 [ 0, histImage.rows ]
normalize(hist, hist, 0, histImage.rows,
cv::NORM_MINMAX, -1, cv::Mat() );
// 在直方图画布上画出直方图
for( int i = 1; i < nHistSize; i++ )
{
line( histImage, cv::Point(bin_w*(i-1),
hist_h-cvRound(hist.at<float>(i-1)) ) ,
cv::Point( bin_w*(i),
hist_h - cvRound(hist.at<float>(i)) ),
cv::Scalar( 0, 0, 255), 2, 8, 0 );
}
// 显示直方图
cv::imshow("histImage", histImage);
Mat heqImage;
equalizeHist(ImageGray,heqImage);
imshow("heqImage",heqImage);
cv::MatND hist2;
// 计算直方图
cv::calcHist(&heqImage,1,channels,cv::Mat(),hist2,1,
histSize,ranges);
cv::Mat histImage2( hist_w, hist_h,
CV_8UC3, cv::Scalar( 0,0,0) );
// 将直方图归一化到范围 [ 0, histImage.rows ]
normalize(hist2, hist2, 0, histImage2.rows,
cv::NORM_MINMAX, -1, cv::Mat() );
// 在直方图画布上画出直方图
for( int i = 1; i < nHistSize; i++ )
{
line( histImage2, cv::Point(bin_w*(i-1),
hist_h-cvRound(hist2.at<float>(i-1)) ) ,
cv::Point( bin_w*(i),
hist_h - cvRound(hist2.at<float>(i)) ),
cv::Scalar( 0, 0, 255), 2, 8, 0 );
}
// 显示直方图
cv::imshow("histImage2", histImage2);
cv::waitKey(0);
return 0;
}
若图像为彩色图像,若要提取图像的红色部分,应怎样处理。
在进行彩色提取时,RGB通道并不能很好地反映出物体的颜色信息,在这里选取HSV颜色空间进行处理,红色在HSV颜色空间中的色度通道范围是0-10和160-180。
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
int main()
{
Mat srcImage = imread("images/strawberries.tif");
if(!srcImage.data) return -1;
imshow("srcImage",srcImage);
Mat hsvImage;
cvtColor(srcImage,hsvImage,COLOR_BGR2HSV);
imshow("hsvImage",hsvImage);
Mat lowTempMat;
Mat upperTempMat;
inRange(hsvImage,Scalar(0,100,100),Scalar(10,255,255),lowTempMat);
inRange(hsvImage,Scalar(160,100,100),Scalar(179,255,255),upperTempMat);
Mat redTempMat;
addWeighted(lowTempMat,1.0,upperTempMat,1.0,0.0,redTempMat);
imshow("redTempMat",redTempMat);
cv::waitKey(0);
return 0;
}