opencv——图像灰度化
彩色图像转换灰度图像
在OpenCV中很容易地将彩色图像转换为灰度图像,这是许多图像处理和计算机视觉算法的常见预处理步骤。
话不多说直接上代码
#include <opencv2/opencv.hpp>
int main() {
cv::Mat image = cv::imread("input_image.jpg");
cv::Mat gray_image;
cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);
cv::imshow("Gray Image", gray_image);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
对上述代码做一个简单介绍
在OpenCV中,图像灰度化可以通过以下步骤完成:
1.读取图像:使用cv::imread
函数加载彩色图像,将其存储在一个cv::Mat
对象中。
2.将图像转换为灰度图像:使用cv::cvtColor
函数将彩色图像转换为灰度图像。在函数的第一个参数中传入彩色图像,第二个参数指定转换的方式,通常使用cv::COLOR_BGR2GRAY
表示将BGR彩色图像转换为灰度图像。
3.显示灰度图像:使用cv::imshow
函数显示灰度图像,然后使用cv::waitKey
等函数来等待用户关闭窗口。
上述函数是opencv中常见常用的基础函数
cv::imread
函数后面的参数就是所需要读取的图片的文件路径;
cv::cvtColor
函数就是我们实现图像格式转换的功能实现的主要函数,参数为(原图,灰度图像,转换格式)这里不仅可以将其转换为GARY格式的单通道灰度图像(COLOR_BGR2GRAY),还有一些其他常用的转换。
以下是一些常见的颜色空间转换格式:
1.COLOR_BGR2GRAY: 将BGR彩色图像转换为灰度图像。
2.COLOR_BGR2HSV: 将BGR彩色图像转换为HSV色彩空间。
3.COLOR_BGR2HLS: 将BGR彩色图像转换为HLS色彩空间。
4.COLOR_BGR2Lab: 将BGR彩色图像转换为Lab色彩空间。
5.COLOR_BGR2Luv: 将BGR彩色图像转换为Luv色彩空间。
6.COLOR_BGR2XYZ: 将BGR彩色图像转换为XYZ色彩空间。
7.COLOR_BGR2YCrCb: 将BGR彩色图像转换为YCrCb色彩空间。
8.COLOR_BGR2YUV: 将BGR彩色图像转换为YUV色彩空间。
cv::imshow函数就是显示图像的函数,参数是(打开窗口的标题,灰度图像变量)。
cv::waitKey(0):这个函数会暂停程序的执行,直到用户按下一个键为止。括号中的参数 0 表示无限期等待,直到用户按下任意键。如果将参数设置为一个正整数 n,则表示等待 n 毫秒后自动继续执行程序。这个函数通常用于在显示图像或视频时等待用户交互。
cv::destroyAllWindows():这个函数用于关闭所有由OpenCV创建的窗口。当你完成图像或视频的显示后,应该调用这个函数来释放窗口资源。如果你不调用这个函数,窗口可能会一直保留在屏幕上,占用系统资源。
上述代码是在VScode中实现的,请自行配置opencv。
结合qt灰度化功能实现
Radio button
这里我们介绍一个新的控件Radio button 。
Radio button 是一种常见的 GUI 控件,用于在多个互斥选项中进行单选。
它具有选中状态: 每个 radio button 都有两种状态 - 选中和未选中。选中状态通常用一个实心圆圈或勾选标记来表示。
事件处理: 当用户选择一个 radio button 时,通常会触发一个事件,开发者可以在事件处理函数中执行相应的操作。
界面控件添加
选择ui文件进入ui界面设计
直接拖动添加就可以了。之后我们的界面设计为
我们的界面就做成这样,我这里使用了一些布局设置。
代码及功能的实现
我们首先在ui界面设计选中添加的Radio button控件右键转到槽
这里选择第二个,在我们的Mainwindow.h 文件中会自动生成槽函数的声明。
private slots:
void on_pushButton_clicked();
void on_radioButton_clicked(bool checked);
返回的是一个布尔值checked。
我们还需要定义一个功能实现的函数命名为grayImage。
void grayImage(bool checked);
然后在我们的Mainwindow.cpp 文件中我们书写我们的Radio button控件的槽函数。
void MainWindow::on_radioButton_clicked(bool checked)
{
grayImage(checked);
}
当点击这个控件的时候去调用我们自己定义的功能函数grayImage。
这里解释一下为什么选择槽函数时选择的是返回一个布尔值参数的形式。
上面介绍Radio button控件时提到了Radio button控件有两种启用状态的。这里返回布尔值就是为了区分两种状态。
grayImage函数
void MainWindow::grayImage(bool checked)
{
if (checked) {
Mat or_image;
cvtColor(cvImage, or_image, COLOR_BGR2RGB);
QImage image((const unsigned char*)(or_image.data), or_image.cols, or_image.rows, or_image.step, QImage::Format_RGB888);
QImage grayImage = image.convertToFormat(QImage::Format_Grayscale8);
QImage disimage = Centor(grayImage, ui->label);
QPixmap pixmap = QPixmap::fromImage(grayImage);
ui->label->setPixmap(QPixmap::fromImage(disimage));
ui->label->setScaledContents(true);
ui->label->setAlignment(Qt::AlignCenter);
} else {
Mat cvImage1;
cvtColor(cvImage, cvImage1, COLOR_BGR2RGB);
QImage image((const unsigned char*)(cvImage1.data), cvImage1.cols, cvImage1.rows, cvImage1.step, QImage::Format_RGB888);
QImage disimage = Centor(image, ui->label);
ui->label->setPixmap(QPixmap::fromImage(disimage));
ui->label->setScaledContents(true);
ui->label->setAlignment(Qt::AlignCenter);
}
}
这里加一个if的条件判断区分控件两种状态的功能
其中的cvImage时另一个pushbutton槽函数中读取的图像数据,这里我们使用它时需要将其设置为全局变量。(mainwindow.h文件)
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
Mat cvImage;
其中在if判断为Ture时的对于图像做灰度化处理,在flase时显示的是原图像。
在做灰度处理时我这里使用了与上述讲解不同的方式。
QImage grayImage = image.convertToFormat(QImage::Format_Grayscale8);
这行代码是使用Qt框架中的QImage类的成员函数convertToFormat来实现的。这个函数的作用是将图像转换为指定的格式。在这里,我们将图像转换为灰度图像(8位灰度)。下面是对这行代码中使用的函数和参数的详细解释:
image: 这是原始的QImage对象,它是您想要转换的图像。
convertToFormat: 这是QImage类的成员函数,用于将图像转换为指定的格式。它接受一个参数,即要转换的目标格式。
QImage::Format_Grayscale8: 这是Qt中定义的一个枚举值,表示将图像转换为8位灰度格式。这意味着每个像素用一个8位的灰度值来表示,范围通常是0(黑色)到255(白色)。