使用Label和GraphicsView两种方式实现图像的灰度化和二值化处理

119 篇文章 ¥59.90 ¥99.00
本文介绍了在Qt环境中,利用Label和GraphicsView两种控件实现图像的灰度化及二值化处理。分别通过为Label添加槽函数和GraphicsView创建处理函数的方式,详细阐述了具体实现过程并提供了源代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Qt中,我们可以使用Label和GraphicsView两种方式来显示图像,并通过自定义的方法实现图像的灰度化和二值化处理。下面将详细介绍如何使用这两种方式,并提供相应的源代码示例。

  1. 使用Label方式实现图像的灰度化和二值化处理

首先,我们需要在Qt的UI界面中添加一个Label控件,用于显示图像。接下来,我们创建一个槽函数来实现图像的灰度化和二值化处理,并将处理后的图像显示在Label控件中。

// 声明灰度化和二值化处理的槽函数
private slots:
    void processImage();

// 在槽函数中实现图像的灰度化和二值化处理
void Widget
#pragma once #include <QLabel> #include <QWheelEvent> #include <HalconCpp.h> using namespace Halcon; class CMyLabel : public QLabel { Q_OBJECT public: CMyLabel(QWidget *parent = Q_NULLPTR); ~CMyLabel(); //设置Halcon图像Halcon窗口句柄,用户响应鼠标事件后实时更新图像 void setHalconWnd(Hobject img, HTuple hHalconID, QLabel *label); //鼠标滚轮缩放事件 void wheelEvent(QWheelEvent *ev); //鼠标按下事件 void mousePressEvent(QMouseEvent *ev); //鼠标释放事件 void mouseReleaseEvent(QMouseEvent *ev); //鼠标移动事件 void mouseMoveEvent(QMouseEvent *ev); public: HTuple m_labelID; //Qt标签句柄 HTuple m_hHalconID; //Halcon窗口句柄 Hobject m_currentImg; //当前的图像 //主界面显示坐标的标签 QLabel *m_label; //鼠标按下的位置 HTuple m_tMouseDownRow; HTuple m_tMouseDownCol; bool m_bIsMove; //是否移动图像标识 }; #include "CMyLabel.h" //定义单步放大倍率 #define ZOOMRATIO 2.0 CMyLabel::CMyLabel(QWidget *parent) : QLabel(parent) { m_bIsMove = false; } CMyLabel::~CMyLabel() { } //设置Halcon图像Halcon窗口句柄,用户响应鼠标事件后实时更新图像 void CMyLabel::setHalconWnd(Hobject img, HTuple hHalconID, QLabel *label) { m_hHalconID = hHalconID; m_currentImg = img; m_label = label; } //鼠标滚轮缩放事件,用于缩放图像 void CMyLabel::wheelEvent(QWheelEvent *ev) { double Zoom; //放大或缩小倍率 HTuple mouseRow, mouseCol, Button; HTuple startRowBf, startColBf, endRowBf, endColBf, Ht, Wt, startRowAft, startColAft, endRowAft, endColAft; //滚轮前滑,放大 if (ev->delta() > 0) { Zoom = ZOOMRATIO; } else { Zoom = 1 / ZOOMRATIO; } //获取光标在原图上的位置,注意是原图坐标,不是Label下的坐标 set_check("~give_error"); Herror ret = get_mposition(m_hHalconID, &mouseRow, &mouseCol, &Button); set_check("give_error"); //当光标不在Halcon窗口内时返回,否则会报错 if (ret != H_MSG_TRUE) { return; } //获取原图显示的部分,注意也是原图坐标 get_part(m_hHalconID, &startRowBf, &startColBf, &endRowBf, &endColBf); //缩放前显示图像宽高 Ht = endRowBf - startRowBf; Wt = endColBf - startColBf; //普通版halcon能处理图像最大尺寸是32K*32K。如果无限缩小原图像,导致显示图像超出限制,则会造成程序崩溃 if ((Ht * Wt < 20000 * 20000 || Zoom == ZOOMRATIO)) { //计算缩放后的图像区域 startRowAft = mouseRow - ((mouseRow - startRowBf) / Zoom); startColAft = mouseCol - ((mouseCol - startColBf) / Zoom); endRowAft = startRowAft + (Ht / Zoom); endColAft = startColAft + (Wt / Zoom); //如果放大过大,则返回 if (endRowAft - startRowAft < 2) { return; } if (m_hHalconID != NULL) { //如果有图像,则先清空图像 detach_background_from_window(m_hHalconID); } set_part(m_hHalconID, startRowAft, startColAft, endRowAft, endColAft); attach_background_to_window(m_currentImg, m_hHalconID); } } //鼠标按下事件 void CMyLabel::mousePressEvent(QMouseEvent *ev) { HTuple mouseRow, mouseCol, Button; set_check("~give_error"); Herror ret = get_mposition(m_hHalconID, &mouseRow, &mouseCol, &Button); set_check("give_error"); //当光标不在Halcon窗口内时返回,否则会报错 if (ret != H_MSG_TRUE) { return; } //鼠标按下时的行列坐标 m_tMouseDownRow = mouseRow; m_tMouseDownCol = mouseCol; m_bIsMove = true; } //鼠标释放事件 void CMyLabel::mouseReleaseEvent(QMouseEvent *ev) { m_bIsMove = false; } //鼠标移动事件 void CMyLabel::mouseMoveEvent(QMouseEvent *ev) { HTuple startRowBf, startColBf, endRowBf, endColBf, mouseRow, mouseCol, Button; //获取当前鼠标在原图的位置 set_check("~give_error"); Herror ret= get_mposition(m_hHalconID, &mouseRow, &mouseCol, &Button); set_check("give_error"); //当光标不在Halcon窗口内时返回,否则会报错 if (ret != H_MSG_TRUE) { return; } //鼠标按下并移动时,移动图像,否则只显示坐标 if (m_bIsMove) { //计算移动值 double RowMove = mouseRow[0].D() - m_tMouseDownRow[0].D(); double ColMove = mouseCol[0].D() - m_tMouseDownCol[0].D(); //得到当前的窗口坐标 get_part(m_hHalconID, &startRowBf, &startColBf, &endRowBf, &endColBf); //移动图像 if (m_hHalconID != NULL) { //如果有图像,则先清空图像 detach_background_from_window(m_hHalconID); } set_part(m_hHalconID, startRowBf - RowMove, startColBf - ColMove, endRowBf - RowMove, endColBf - ColMove); attach_background_to_window(m_currentImg, m_hHalconID); } //获取灰度值 HTuple pointGray; set_check("~give_error"); ret = get_grayval(m_currentImg, mouseRow, mouseCol, &pointGray); set_check("give_error"); //当光标不在Halcon窗口内时返回,否则会报错 if (ret != H_MSG_TRUE) { m_label->setText(QString::fromLocal8Bit("X坐标:- Y坐标:- 灰度值:-")); return; } //设置坐标 m_label->setText(QString::fromLocal8Bit("X坐标:%1 Y坐标:%2 灰度值:%3").arg(mouseCol[0].D()).arg(mouseRow[0].D()).arg(pointGray[0].D())); } #pragma once #include <QtWidgets/QWidget> #include "ui_BrowsePic.h" #include <HalconCpp.h> #include <QToolBar> using namespace Halcon; #pragma execution_character_set("utf-8"); class BrowsePic : public QWidget { Q_OBJECT public: BrowsePic(QWidget *parent = Q_NULLPTR); ~BrowsePic(); //初始化 void init(); //打开窗口 void showImg(); //窗体大小改变事件 void resizeEvent(QResizeEvent *ev); public: //显示图像的控件id HTuple m_hLabelID; //QLabel控件句柄 HTuple m_hHalconID; //Halcon显示窗口句柄 //原始图像的尺寸 HTuple m_imgWidth, m_imgHeight; //图片路径列表 HTuple m_imgFiles; //当前图像 Hobject m_hCurrentImg; //当前图像的下标 HTuple index; //是否等比缩放 bool m_bIsEqualScale; //是否居中显示 bool m_bIsShowCenter; //缩放后的图像 Hobject m_hResizedImg; //缩放系数 HTuple m_hvScaledRate; //缩放后图像的大小 HTuple m_scaledHeight, m_scaledWidth; QToolBar *m_toolBar; public slots: //打开图片 void on_btn_openPic_clicked(); //浏览前一张 void on_btn_prePic_clicked(); //浏览后一张 void on_btn_nextPic_clicked(); //恢复图片 void on_btn_resetPic_clicked(); //等比缩放复选框状态改变 void on_checkBox_equalScale_stateChanged(int); //居中显示复选框状态改变 void on_checkBox_showCenter_stateChanged(int); private: Ui::BrowsePicClass ui; }; #include "BrowsePic.h" #include <QFileDialog> #include <QFileInfo> #include <QLabel> BrowsePic::BrowsePic(QWidget *parent) : QWidget(parent) { ui.setupUi(this); //初始化 init(); } BrowsePic::~BrowsePic() { } //初始化 void BrowsePic::init() { //设置halcon的文件路径为utf8,解决中文乱码 set_system("filename_encoding", "utf8"); //生成空图像 gen_empty_obj(&m_hCurrentImg); //获取图像显示控件的句柄 m_hHalconID = NULL; m_hLabelID = (Hlong)ui.label_show->winId(); m_bIsEqualScale = false; m_bIsShowCenter = true; ui.checkBox_equalScale->setChecked(m_bIsEqualScale); ui.checkBox_showCenter->setChecked(m_bIsShowCenter); ui.checkBox_showCenter->setEnabled(false); } //打开窗口 void BrowsePic::showImg() { //判断图像是否为空 Hlong isEqual; Hobject emptyObj; gen_empty_obj(&emptyObj); test_equal_obj(emptyObj, m_hCurrentImg, &isEqual); if (isEqual) { return; } if (m_hHalconID != NULL) { //如果有图像,则先清空图像 detach_background_from_window(m_hHalconID); } else { //打开窗口 open_window(0, 0, ui.label_show->width(), ui.label_show->height(), m_hLabelID, "visible", "", &m_hHalconID); } ui.label_show->setHalconWnd(m_hCurrentImg, m_hHalconID, ui.label_status); get_image_size(m_hCurrentImg, &m_imgWidth, &m_imgHeight); //判断是否等比缩放 if (m_bIsEqualScale) { //获取缩放系数 tuple_min2(1.0 * ui.label_show->width() / m_imgWidth, 1.0 * ui.label_show->height() / m_imgHeight, &m_hvScaledRate); //进行图像缩放 zoom_image_factor(m_hCurrentImg, &m_hResizedImg, m_hvScaledRate, m_hvScaledRate, "constant"); get_image_size(m_hResizedImg, &m_scaledWidth, &m_scaledHeight); set_window_extents(m_hHalconID, 0, 0, m_scaledWidth, m_scaledHeight); if (m_bIsShowCenter) { if (1.0*ui.label_show->width() / m_imgWidth < 1.0*ui.label_show->height() / m_imgHeight) { set_window_extents(m_hHalconID, ui.label_show->height() / 2.0 - m_scaledHeight / 2.0, 0, ui.label_show->width(), m_scaledHeight); } else { set_window_extents(m_hHalconID, 0, ui.label_show->width() / 2.0 - m_scaledWidth / 2.0, m_scaledWidth, ui.label_show->height()); } } } else { set_window_extents(m_hHalconID, 0, 0, ui.label_show->width(), ui.label_show->height()); } set_part(m_hHalconID, 0, 0, m_imgHeight - 1, m_imgWidth - 1); attach_background_to_window(m_hCurrentImg, m_hHalconID); } //窗体大小改变事件 void BrowsePic::resizeEvent(QResizeEvent *ev) { if (m_hHalconID != NULL) { //防止窗口闪烁 set_system("flush_graphic","false"); showImg(); set_system("flush_graphic", "true"); detach_background_from_window(m_hHalconID); attach_background_to_window(m_hCurrentImg, m_hHalconID); } } //打开图片 void BrowsePic::on_btn_openPic_clicked() { //打开选择文件对话框,选择文件 QString qtFilePath = QFileDialog::getOpenFileName(this, "选择图片", "./", "图像文件(*.jpg *.png *.bmp *.tif)"); if (qtFilePath.isEmpty()) { return; } QFileInfo fileInfo(qtFilePath); qtFilePath.replace("/", "\\"); QString hPath = fileInfo.path().replace("/", "\\"); //由halcon算子获取选中的文件夹中的所有文件 list_files(hPath.toStdString().c_str(), HTuple("files").Append("follow_links"), &m_imgFiles); //筛选符合图片格式的文件 tuple_regexp_select(m_imgFiles, HTuple("\\.(jpg|png|bmp|tif)$").Append("ignore_case"), &m_imgFiles); //找到选择的文件 tuple_find(m_imgFiles, qtFilePath.toStdString().c_str(), &index); //读取图像 read_image(&m_hCurrentImg, HTuple(m_imgFiles[index])); showImg(); } //浏览前一张 void BrowsePic::on_btn_prePic_clicked() { if (index.Num()>0&&index[0].I() > 0) { index[0] = index[0].I() - 1; read_image(&m_hCurrentImg, HTuple(m_imgFiles[index])); showImg(); } } //浏览后一张 void BrowsePic::on_btn_nextPic_clicked() { if (index.Num()>0 && index[0].I() < m_imgFiles.Num() - 1) { index[0] = index[0].I() + 1; read_image(&m_hCurrentImg, HTuple(m_imgFiles[index])); showImg(); } } //恢复图片 void BrowsePic::on_btn_resetPic_clicked() { showImg(); } //等比缩放复选框状态改变 void BrowsePic::on_checkBox_equalScale_stateChanged(int state) { ui.checkBox_showCenter->setEnabled(state); m_bIsEqualScale = state; showImg(); } //居中显示复选框状态改变 void BrowsePic::on_checkBox_showCenter_stateChanged(int state) { m_bIsShowCenter = state; showImg(); } 在vs上运行,halcon是20.11版本
最新发布
07-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值