当前位置: 首页 > news >正文

图像锐化(QT)

如果不使用OpenCV,我们可以直接使用Qt的`QImage`类对图像进行像素级操作来实现锐化。锐化算法的核心是通过卷积核(如拉普拉斯核)对图像进行处理,增强图像的边缘和细节。

以下是一个完整的Qt应用程序示例,展示如何使用Qt实现图像锐化。

---

### 1. 实现思路
1. **读取图像**:使用`QImage`加载图像。
2. **锐化处理**:定义一个拉普拉斯卷积核,对图像的每个像素进行卷积操作。
3. **显示图像**:将处理后的图像显示在`QLabel`中。

---

### 2. 代码实现

#### 项目文件(`.pro`)
确保在`.pro`文件中包含必要的Qt模块:
```pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

SOURCES += main.cpp
```

---

#### 主程序(`main.cpp`)
```cpp
#include <QApplication>
#include <QFileDialog>
#include <QLabel>
#include <QHBoxLayout>
#include <QPushButton>
#include <QWidget>
#include <QImage>
#include <QPainter>

class ImageSharpener : public QWidget {
    Q_OBJECT

public:
    ImageSharpener(QWidget *parent = nullptr) : QWidget(parent) {
        // 创建界面
        QPushButton *openButton = new QPushButton("Open Image", this);
        QPushButton *sharpenButton = new QPushButton("Sharpen Image", this);
        imageLabel = new QLabel(this);

        QHBoxLayout *layout = new QHBoxLayout(this);
        layout->addWidget(openButton);
        layout->addWidget(sharpenButton);
        layout->addWidget(imageLabel);

        // 连接按钮信号
        connect(openButton, &QPushButton::clicked, this, &ImageSharpener::openImage);
        connect(sharpenButton, &QPushButton::clicked, this, &ImageSharpener::sharpenImage);
    }

private slots:
    void openImage() {
        // 打开文件对话框选择图像
        QString fileName = QFileDialog::getOpenFileName(this, "Open Image", "", "Images (*.png *.jpg *.bmp)");
        if (fileName.isEmpty()) return;

        // 加载图像
        originalImage.load(fileName);
        if (originalImage.isNull()) {
            imageLabel->setText("Failed to load image!");
            return;
        }

        // 显示原始图像
        displayImage(originalImage);
    }

    void sharpenImage() {
        if (originalImage.isNull()) {
            imageLabel->setText("No image loaded!");
            return;
        }

        // 将图像转换为32位格式(方便像素操作)
        QImage image = originalImage.convertToFormat(QImage::Format_ARGB32);

        // 定义拉普拉斯卷积核
        int kernel[3][3] = {
            { 0, -1,  0},
            {-1,  5, -1},
            { 0, -1,  0}
        };

        // 对图像进行锐化处理
        QImage sharpenedImage = applyKernel(image, kernel);

        // 显示锐化后的图像
        displayImage(sharpenedImage);
    }

private:
    // 应用卷积核
    QImage applyKernel(const QImage &image, const int kernel[3][3]) {
        int width = image.width();
        int height = image.height();
        QImage result(image.size(), image.format());

        for (int y = 1; y < height - 1; ++y) {
            for (int x = 1; x < width - 1; ++x) {
                int r = 0, g = 0, b = 0;

                // 对每个像素应用卷积核
                for (int ky = -1; ky <= 1; ++ky) {
                    for (int kx = -1; kx <= 1; ++kx) {
                        QRgb pixel = image.pixel(x + kx, y + ky);
                        int weight = kernel[ky + 1][kx + 1];
                        r += qRed(pixel) * weight;
                        g += qGreen(pixel) * weight;
                        b += qBlue(pixel) * weight;
                    }
                }

                // 限制像素值在0-255范围内
                r = qBound(0, r, 255);
                g = qBound(0, g, 255);
                b = qBound(0, b, 255);

                // 设置结果图像的像素值
                result.setPixel(x, y, qRgb(r, g, b));
            }
        }

        return result;
    }

    // 显示图像
    void displayImage(const QImage &image) {
        imageLabel->setPixmap(QPixmap::fromImage(image));
        imageLabel->setScaledContents(true);
    }

    QImage originalImage;
    QLabel *imageLabel;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    ImageSharpener window;
    window.setWindowTitle("Image Sharpener");
    window.resize(800, 600);
    window.show();

    return app.exec();
}

#include "main.moc"
```

---

### 3. 代码说明
1. **界面设计**:
   - 使用`QPushButton`选择图像和应用锐化。
   - 使用`QLabel`显示图像。

2. **锐化算法**:
   - 定义一个3x3的拉普拉斯卷积核:
     ```
     { 0, -1,  0},
     {-1,  5, -1},
     { 0, -1,  0}
     ```
   - 对图像的每个像素应用卷积核,计算新的像素值。

3. **像素操作**:
   - 使用`QImage::pixel`获取像素值。
   - 使用`QImage::setPixel`设置像素值。

4. **图像显示**:
   - 将处理后的`QImage`转换为`QPixmap`并显示在`QLabel`中。

---

### 4. 运行效果
1. 点击“Open Image”按钮选择图像文件。
2. 点击“Sharpen Image”按钮应用锐化算法。
3. 锐化后的图像会显示在窗口中。

---

### 5. 注意事项
- 卷积核的值可以根据需要调整,以控制锐化效果。
- 由于直接操作像素,处理大图像时可能会比较慢。可以通过优化算法(如多线程)提高性能。

通过这种方式,你可以在Qt中完全基于Qt库实现图像锐化功能,而无需依赖OpenCV!

相关文章:

图像锐化(QT)

如果不使用OpenCV&#xff0c;我们可以直接使用Qt的QImage类对图像进行像素级操作来实现锐化。锐化算法的核心是通过卷积核&#xff08;如拉普拉斯核&#xff09;对图像进行处理&#xff0c;增强图像的边缘和细节。 以下是一个完整的Qt应用程序示例&#xff0c;展示如何使用Qt…...

38.社区信息管理系统(基于springboothtml)

目录 1.系统的受众说明 2.需求分析及相关技术 2.1设计目的 2.2社区信息管理系统的特点 2.3可行性分析 2.3.1技术可行性 2.3.2运行可行性 2.4系统设计 2.4.1系统功能分析 2.4.2管理员权限功能设计 2.4.3业主权限功能设计 2.5系统的技术介绍 2.5.1 Html 2.5.2 Aja…...

游戏引擎学习第98天

仓库:https://gitee.com/mrxiao_com/2d_game_2 开始进行一点回顾 今天的目标是继续实现正常贴图的操作&#xff0c;尽管目前我们还没有足够的光照信息来使其完全有用。昨日完成了正常贴图相关的基础工作&#xff0c;接下来将集中精力实现正常贴图的基本操作&#xff0c;并准备…...

音频知识基础

音频知识基础 声音属性声音度量人耳特性通道数音频数字化传输接口 声音属性 响度 响度是人耳对声音强弱的主观感受&#xff1b; 主要和声波的振幅相关&#xff0c;同时也和频率有一定关系&#xff1b; 音调 音调是人耳对声音高低的主观感受&#xff1b; 主要与频率相关&#…...

【AI赋能】蓝耘智算平台实战指南:3步构建企业级DeepSeek智能助手

蓝耘智算平台实战指南&#xff1a;3步构建企业级DeepSeek智能助手 引言&#xff1a;AI大模型时代的算力革命 在2025年全球AI技术峰会上&#xff0c;DeepSeek-R1凭借其开源架构与实时推理能力&#xff0c;成为首个通过图灵测试的中文大模型。该模型在语言理解、跨模态交互等维…...

LabVIEW无人机飞行状态监测系统

近年来&#xff0c;无人机在农业植保、电力巡检、应急救灾等多个领域得到了广泛应用。然而&#xff0c;传统的目视操控方式仍然存在以下三大问题&#xff1a; 飞行姿态的感知主要依赖操作者的经验&#xff1b; 飞行中突发的姿态异常难以及时发现&#xff1b; 飞行数据缺乏系统…...

DeepSeek模型架构及优化内容

DeepSeek v1版本 模型结构 DeepSeek LLM基本上遵循LLaMA的设计&#xff1a; 采⽤Pre-Norm结构&#xff0c;并使⽤RMSNorm函数. 利⽤SwiGLU作为Feed-Forward Network&#xff08;FFN&#xff09;的激活函数&#xff0c;中间层维度为8/3. 去除绝对位置编码&#xff0c;采⽤了…...

html语义化

常见语义化标签有&#xff1a; &#xff08;1&#xff09;页面结构标签&#xff1a;<header>、<nav>、<main>、<article>、<section>、<aside>、<footer> &#xff08;2&#xff09;文本语义标签&#xff1a;<h1>-<h6>…...

python学习第十四天之机器学习名词介绍

名词介绍 1. 常用术语解释2.常见机器学习任务3. 机器学习常见算法1. 监督学习&#xff08;Supervised Learning&#xff09;2. 非监督学习&#xff08;Unsupervised Learning&#xff09;3.深度学习4.**对比总结** 1. 常用术语解释 拟合&#xff08;Fit&#xff09;&#xff1…...

天津三石峰科技——汽车生产厂的设备振动检测项目案例

汽车产线有很多传动设备需要长期在线运行&#xff0c;会出现老化、疲劳、磨损等 问题&#xff0c;为了避免意外停机造成损失&#xff0c;需要加装一些健康监测设备&#xff0c;监测设备运 行状态。天津三石峰科技采用 12 通道振动信号采集卡&#xff08;下图 1&#xff09;对…...

汽车与AI深度融合:CES Asia 2025前瞻

在科技飞速发展的当下&#xff0c;汽车与AI的融合正成为行业变革的关键驱动力。近日&#xff0c;吉利、极氪、岚图、智己等多家车企纷纷官宣与DeepSeek模型深度融合&#xff0c;其中岚图知音更是将成为首个搭载该模型的量产车型&#xff0c;这无疑是汽车智能化进程中的重要里程…...

前端实现 GIF 图片循环播放

前言 使用 img 加载 GIF 图片&#xff0c;内容只会播放一次&#xff0c;之后就会自动暂停&#xff1b; 通过定时器在一段时间后重新加载图片的方式&#xff0c;会导致浏览器内存不断增大&#xff0c;并且可能会有闪烁、卡顿的问题&#xff1b; ImageDecoder WebCodecs API 的…...

React - 事件绑定this

在 React 中&#xff0c;this 的绑定是一个常见问题&#xff0c;尤其在类组件中使用事件处理函数时。JavaScript 中的 bind 函数用于设置函数调用时 this 的值。 bind 函数的作用 bind() 方法创建一个新的函数&#xff0c;当被调用时&#xff0c;其 this 关键字被设置为提供的…...

STM32系统架构介绍

STM32系统架构 1. CM3/4系统架构2. CM3/4系统架构-----存储器组织结构2.1 寄存器地址映射&#xff08;特殊的存储器&#xff09;2.2 寄存器地址计算2.3 寄存器的封装 3. CM3/4系统架构-----时钟系统 STM32 和 ARM 以及 ARM7是什么关系? ARM 是一个做芯片标准的公司&#xff0c…...

Macbook Pro快速搭建Easysearch学习环境

在学习过程中&#xff0c;我们有时身边没有可用的服务器&#xff0c;这时就需要借助自己的 Mac 来安装和学习 Easysearch。然而&#xff0c;Easysearch 官网并未提供 Mac 版本的安装教程&#xff0c;下面我将详细整理我在 Mac 上安装和使用 Easysearch 的折腾经历。 Easysearc…...

老游戏回顾:SWRacer

竞速类游戏里&#xff0c;我很怀念它。 虽然已经25年过去了。 相比之下&#xff0c;别的游戏真的没法形容。 ---- 是LucasArts制作的一款赛车竞速游戏&#xff1b; 玩家要扮演一名银河旅行者参加各种赛车比赛&#xff0c;赢得奖金&#xff0c;在经历了八个不同星球上的24场…...

Firefox无法隐藏标题栏

Openbox 窗管 Firefox 无法隐藏标题栏。 深度Linux安装火狐,Linux(deepin) 下隐藏 Firefox 标题栏-CSDN博客 需要在 desktop 的 exec 中增加环境变量&#xff1a; Execenv MOZ_GTK_TITLEBAR_DECORATIONclient firefox...

vue基础(五)

Vue 实例在创建、挂载、更新、销毁的过程中会触发一系列的生命周期钩子&#xff08;Lifecycle Hooks&#xff09;&#xff0c;让开发者可以在不同阶段执行逻辑。 1. Vue 2 生命周期完整流程 生命周期的四个主要阶段 创建阶段&#xff08;Creation&#xff09;挂载阶段&#…...

MySQL的深度分页如何优化?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL的深度分页如何优化&#xff1f;】面试题。希望对大家有帮助&#xff1b; MySQL的深度分页如何优化&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL的深度分页&#xff08;即跳过大量数据后进行分…...

深度学习每周学习总结R6(RNN实现阿尔茨海默病诊断)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客R8中的内容&#xff0c;为了便于自己整理总结起名为R6&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. 数据集介绍2. 数据预处理3. 模型构建4. 初始化模型及优化器5. 训练函…...

Python 爬虫进阶技巧:定时爬虫任务实现无人值守采集

前言 常规爬虫多依赖手动触发脚本运行,单次采集完成后需人工二次启动,无法满足日常周期性数据监控、行情抓取、资讯同步、业务台账定时归档等常态化采集需求。搭建可自主调度、自动启停、周期循环的定时爬虫任务,脱离人工干预实现无人值守全自动采集,是爬虫从临时脚本走向…...

Go语言实现Dify与钉钉机器人集成:企业级AI应用开发实战

1. 项目概述&#xff1a;当Dify遇上钉钉&#xff0c;打造企业级AI应用新范式 最近在折腾一个挺有意思的项目&#xff0c;叫“MAyang38/dify-on-dingding-go”。光看名字&#xff0c;可能有点技术黑话的味道&#xff0c;但说白了&#xff0c;这就是一个“桥梁”项目。它的核心使…...

三步轻松上手:BilldDesk Pro开源远程桌面控制工具完整指南

三步轻松上手&#xff1a;BilldDesk Pro开源远程桌面控制工具完整指南 【免费下载链接】billd-desk 基于Vue3 WebRTC Nodejs Flutter搭建的远程桌面控制、游戏串流 项目地址: https://gitcode.com/gh_mirrors/bi/billd-desk 如果你正在寻找一款功能强大且完全免费的跨…...

PyTorch深度学习资源大全:如何快速找到最佳教程和项目库的终极指南

PyTorch深度学习资源大全&#xff1a;如何快速找到最佳教程和项目库的终极指南 【免费下载链接】the-incredible-pytorch The Incredible PyTorch: a curated list of tutorials, papers, projects, communities and more relating to PyTorch. 项目地址: https://gitcode.c…...

Cursor AI Pro破解工具2025:终极免费方案解决试用限制问题

Cursor AI Pro破解工具2025&#xff1a;终极免费方案解决试用限制问题 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your…...

招募Kiro大使!会员权益、内测资格等重磅福利等你领!

亚马逊云科技上线了Kiro社区中心与Kiro Labs&#xff0c;旨在为开发者打造一个发现资源、交流联结、共同成长的专属阵地。目前已有不少开发者主动向项目专区投稿作品、分享活动信息&#xff0c;与众多开发者互帮互助一同成长。现在&#xff0c;亚马逊云科技将社区建设再往前推进…...

电子束光刻掩模误差建模与校正技术解析

1. 电子束光刻中的掩模误差来源解析在半导体制造领域&#xff0c;电子束光刻技术因其高分辨率特性而被广泛应用于掩模制作。然而&#xff0c;这一工艺过程中产生的掩模误差会直接影响最终芯片的图形精度和良率。理解这些误差的物理成因是进行有效校正的前提。1.1 电子散射效应的…...

基于DDD与事件驱动的声明处理系统架构设计与实战

1. 项目概述&#xff1a;一个为开发者准备的“索赔”模板仓库最近在GitHub上看到一个挺有意思的项目&#xff0c;叫openclaw-claim-template。光看名字&#xff0c;你可能会有点摸不着头脑&#xff1a;“索赔模板”&#xff1f;这跟开源开发有什么关系&#xff1f;难道是用来写…...

5大实战技巧:深度掌握PyQt6桌面应用开发

5大实战技巧&#xff1a;深度掌握PyQt6桌面应用开发 【免费下载链接】PyQt-Chinese-tutorial PyQt6中文教程 项目地址: https://gitcode.com/gh_mirrors/py/PyQt-Chinese-tutorial 在Python生态中&#xff0c;PyQt6作为最强大的GUI开发框架&#xff0c;为开发者提供了创…...

在线教程丨单卡即可爆改,面壁智能等开源MiniCPM-V-4.6,1.3B端侧模型支持图像理解/视频理解/OCR/多轮多模态对话

过去几年&#xff0c;整个 AI 行业几乎都笼罩在 Scaling Law 的叙事之下。参数越大、训练数据越多&#xff0c;模型似乎就越接近「通用智能」。从千亿到万亿参数&#xff0c;大模型不断刷新人们对推理能力与世界知识的想象&#xff0c;也让「堆算力、卷规模」成为行业默认的发展…...