1.加载图片
void MainWindow::on_btn_load_clicked() {
QString imagePath = QFileDialog::getOpenFileName(this,
"打开图像",
"ddd/",
"(所有图像(*.jpg *.png *.bmp *.jpeg))");
if (imagePath.isEmpty()) {
return;
}
// Mat
srcImage = imread(imagePath.toStdString());
cvtColor(srcImage, srcImage, CV_BGR2RGB);
QImage displayImg = QImage(srcImage.data,
srcImage.cols,
srcImage.rows,
srcImage.cols * srcImage.channels(),
QImage::Format_RGB888);
QImage displayImage = imageCenter(displayImg, ui->lb_show);
ui->lb_show->setPixmap(QPixmap::fromImage(displayImage));
}
2.图像居中显示
// 图片居中显示,图片大小与label大小相适配
QImage MainWindow::imageCenter(QImage qimage, QLabel *qlabel) {
QImage image;
QSize imageSize = qimage.size();
QSize labelSize = qlabel->size();
double dWidthRatio = 1.0 * imageSize.width() / labelSize.width();
double dHeightRatio = 1.0 * imageSize.height() / labelSize.height();
if (dWidthRatio > dHeightRatio) {
image = qimage.scaledToWidth(labelSize.width());
} else {
image = qimage.scaledToHeight(labelSize.height());
}
return image;
}
3.均值滤波
void MainWindow::on_btn_mean_clicked() {
Mat blurImage;
//调用均值滤波方法,图像模糊,消除噪点
blur(srcImage, blurImage, Size(4, 4));
QImage displayImg = QImage(blurImage.data,
blurImage.cols,
blurImage.rows,
blurImage.cols * blurImage.channels(),
QImage::Format_RGB888);
QImage displayImage = imageCenter(displayImg, ui->lbshow2);
ui->lbshow2->setPixmap(QPixmap::fromImage(displayImage));
}
4.边缘检测
// 边缘检测,针对的是灰度图,临近的像素取平均值
void MainWindow::on_btn_canny_clicked() {
if (srcImage.empty()) {
return;
}
Mat edgeImage, grayImage;
//灰度处理
cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
//调用canny边缘检测
// Canny(grayImage, edgeImage, 200, 1);
//拉普拉斯
//Laplacian(grayImage, edgeImage, grayImage.depth());
// 计算x,y防线的边缘检测图
Mat sobel_x, sobel_y;
Sobel(grayImage, sobel_x, CV_8U, 1, 0);
Sobel(grayImage, sobel_y, CV_8U, 0, 1);
// 把x y方向加权平均法
addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0, edgeImage);
//转换为RGB类型图像
cvtColor(edgeImage, edgeImage, COLOR_GRAY2BGR);
QImage displayImg = QImage(edgeImage.data,
edgeImage.cols,
edgeImage.rows,
edgeImage.cols * edgeImage.channels(),
QImage::Format_RGB888);
QImage displayImage = imageCenter(displayImg, ui->lbshow2);
ui->lbshow2->setPixmap(QPixmap::fromImage(displayImage));
}
opencv均值滤波和边缘检测