C++版本OpenCV的四种灰度化方式
void CVGray(const String srcImage,Mat &dstImage);//用OpenCV自带的方法实现灰度处理其实非常简单,只要在读取图片时,读取模式设置为0就可以了。
void CVColorGray(const String srcImage,Mat &dstImage);//我们使用cvtColor()函数也可以达到相同的效果,代码如下:
void CVCustomizeGray(const String srcImage,Mat &dstImage);//当然,我们也可以自己写代码去完成灰度的处理:
//使用 GRAY = (R + G + B)/3 完成灰度处理
void CVWeightGray(const String srcImage,Mat &dstImage,vector<float> weights);//不同权重的灰度化
void CVGray(const String srcImage,Mat &dstImage){
dstImage=cv::imread(srcImage,0);// # 0代表灰色,1代表彩色
}
void CVColorGray(const String srcImage,Mat &dstImage){
Mat Image=cv::imread(srcImage,1);// # 0代表灰色,1代表彩色
cv::cvtColor(Image,dstImage,COLOR_BGR2GRAY);//颜色空间转换
}
void CVCustomizeGray(const String srcImage,Mat &dstImage){
Mat Image=cv::imread(srcImage,1);// # 0代表灰色,1代表彩色
// int height =Image.rows;
// int width =Image.cols;
dstImage =Mat::zeros(Image.size(),CV_8UC1);
for(int row = 0; row < Image.rows; row++)
{
for(int col = 0; col < Image.cols; col++)
{
if(Image.channels() == 3)
{
int b = Image.at<Vec3b>(row, col)[0];
int g = Image.at<Vec3b>(row, col)[1];
int r = Image.at<Vec3b>(row, col)[2];
// saturate_cast<uchar>主要是为了防止颜色溢出操作
dstImage.at<uchar>(row, col)= saturate_cast<uchar>((b + g +r )/3);
}
}
}
}
void CVWeightGray(const String srcImage,Mat &dstImage,std::vector<float> weights){
Mat Image=cv::imread(srcImage,1);// # 0代表灰色,1代表彩色
float Wb,Wg,Wr;
if(weights.size()==3){
Wb=weights[0];
Wg=weights[1];
Wr=weights[2];
}else {
Wb=1;
Wg=1;
Wr=1;
}
// int height =Image.rows;
// int width =Image.cols;
dstImage =Mat::zeros(Image.size(),CV_8UC1);
for(int row = 0; row < Image.rows; row++)
{
for(int col = 0; col < Image.cols; col++)
{
if(Image.channels() == 3)
{
int b = Image.at<Vec3b>(row, col)[0];
int g = Image.at<Vec3b>(row, col)[1];
int r = Image.at<Vec3b>(row, col)[2];
// saturate_cast<uchar>主要是为了防止颜色溢出操作
dstImage.at<uchar>(row, col)= saturate_cast<uchar>((b + g +r )/3);
}
}
}
}