三种方式可以将彩色图像转成灰度图对比
有三种方式可以将彩色图像转成灰度图
1、直接imread(“1.jpg” , 0);直接读取灰度图像
2、读取彩色图像然后 灰度 = 0.299 * 红色 + 0.587 * 绿色 + 0.114 * 蓝色进行转换
3、调用cvtColor函数cvtColor(srcImg, imgShow, COLOR_BGR2GRAY);
通过测试来对比三者的区别:
调用cvtColor(srcImg, imgShow, COLOR_BGR2GRAY); // 图像格式转换和直接读取灰度的方式读取,通过保存像素值,能看出来二者差距挺大
通过调用cvtColor(srcImg, imgShow, COLOR_BGR2GRAY); // 图像格式转换
和用灰度 = 0.299 * 红色 + 0.587 * 绿色 + 0.114 * 蓝色公式进行转换,发现相差很小,基本都是一个像素
通过输出发现:
1、读取彩色图像然后 灰度 = 0.299 * 红色 + 0.587 * 绿色 + 0.114 * 蓝色进行转换 和 调用cvtColor函数cvtColor(srcImg, imgShow, COLOR_BGR2GRAY);几乎一样;
2、直接按照灰度方式读取,余上面二者差距较大
附代码
void writeFile(QString filename , QString p_str)
{
QFile file(filename);
if (file.open(QIODevice::Append | QIODevice::Text)) {
// 创建一个 QTextStream 对象,并将文件与之关联
QTextStream stream(&file);
// 写入文本数据
stream << p_str << endl;
// 关闭文件
file.close();
} else {
qDebug() << "Failed to open file!";
}
}
void MainWindow::on_pushButton_clicked()
{
Mat srcImg = imread("D:\\1.jpg");
if(srcImg.empty())
{
QMessageBox::information(this,"警告","图片读取失败,请检查图片路径!");
return;
}
Mat imgShow ;
cvtColor(srcImg, imgShow, COLOR_BGR2GRAY); // 图像格式转换
// QImage qImg = QImage((unsigned char*)(imgShow.data), imgShow.cols,
// imgShow.rows, imgShow.cols*imgShow.channels(), QImage::Format_RGB888);
// ui->label->setPixmap(QPixmap::fromImage(qImg.scaled(ui->label->size(), Qt::KeepAspectRatio)));
qDebug()<<"通道"<<imgShow.channels()<<endl;
for(int i=0;i<imgShow.rows;++i)
{
uchar*ptr = imgShow.ptr<uchar>(i);
QString mm = "";
for(int j =0;j<imgShow.cols;++j)
{
//qDebug()<<static_cast<int>(ptr[j*3+0])<< static_cast<int>(ptr[j*3+1])<<static_cast<int>(ptr[j*3+2])<<endl;
int t1 = static_cast<int>(ptr[j]);
QString s1 = QString::number(t1);
mm+=s1+",";
}
writeFile("D:\\1.txt" , mm);
}
cv::namedWindow("Display window", cv::WINDOW_AUTOSIZE);
cv::imshow("Display window", imgShow);
cv::waitKey(0);
}
void MainWindow::on_pushButton_3_clicked()
{
Mat imgShow = imread("D:\\1.jpg" , 0);
if (imgShow.empty()) {
std::cout << "Could not open or find the image" << std::endl;
return ;
}
qDebug()<<imgShow.channels()<<endl;
qDebug()<<"通道"<<imgShow.channels()<<endl;
for(int i=0;i<imgShow.rows;++i)
{
uchar*ptr = imgShow.ptr<uchar>(i);
QString mm = "";
for(int j =0;j<imgShow.cols;++j)
{
int t1 = static_cast<int>(ptr[j]);
QString s1 = QString::number(t1);
mm+=s1+",";
}
writeFile("D:\\2.txt" , mm);
}
cv::namedWindow("Display window1", cv::WINDOW_AUTOSIZE);
cv::imshow("Display window1", imgShow);
cv::waitKey(0);
}
void MainWindow::on_pushButton_4_clicked()
{
Mat imgShow = imread("D:\\1.jpg" , 1);
if (imgShow.empty()) {
std::cout << "Could not open or find the image" << std::endl;
return ;
}
qDebug()<<imgShow.channels()<<endl;
qDebug()<<"通道"<<imgShow.channels()<<endl;
Mat imgarr[3];
split(imgShow ,imgarr );
for(int i=0;i<imgShow.rows;++i)
{
uchar*ptr = imgShow.ptr<uchar>(i);
QString mm = "";
for(int j =0;j<imgShow.cols;++j)
{
// qDebug()<<static_cast<int>(ptr[j*3+0])<< static_cast<int>(ptr[j*3+1])<<static_cast<int>(ptr[j*3+2])<<endl;
int t1 = static_cast<int>(ptr[j*3+0]);
int t2 = static_cast<int>(ptr[j*3+1]);
int t3 = static_cast<int>(ptr[j*3+2]);
int dst = 0.299 * t3 + 0.587 * t2 + 0.114 * t1;
QString s1 = QString::number(dst);
mm+=s1+",";
}
writeFile("D:\\3.txt" , mm);
}
cv::namedWindow("Display window1", cv::WINDOW_AUTOSIZE);
cv::imshow("Display window1", imgShow);
cv::waitKey(0);
}