当前位置: 首页 > 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. 训练函…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...