百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

纯Python构建Web应用:Remi与 OpenCV 结合实现图像处理与展示

itomcoil 2025-05-22 10:59 1 浏览

引言

大家好,我是 ICodeWR。在前几篇文章中,我们介绍了 Remi 的基础功能、多页面应用、动态更新、与 Flask 结合、与数据库结合、与 Matplotlib 结合以及与 Pandas 结合。

今天将记录如何将 Remi 与 OpenCV 结合,实现图像处理与展示功能。

OpenCV 是一个强大的计算机视觉库,通过将其与 Remi 结合,我们可以在 Web 应用中动态处理并展示图像。


OpenCV 简介

OpenCV 是一个开源的计算机视觉库,支持图像处理、视频分析、对象检测等功能。

通过将 OpenCV 与 Remi 结合,我们可以在 Web 应用中实现图像处理(如灰度化、边缘检测等)并实时展示处理结果。


案例:创建一个图像处理与展示应用

本案例将通过实现一个图像处理与展示应用的功能,演示如何将 Remi 与 OpenCV 结合。最终效果如下:

前端(Remi)

  • 显示原始图像和处理后的图像。
  • 提供按钮,用于加载图像和应用图像处理(如灰度化、边缘检测)。

后端(OpenCV)

  • 使用 OpenCV 加载和处理图像。
  • 将处理后的图像嵌入到 Remi 应用中。

代码实现

1. 安装依赖

在开始之前,确保已安装 OpenCV 和 Remi。

在项目 RemiEg 目录下创建 day11 子目录,然后在 RemiEg 目录下执行:

# 添加 pandas 库
uv add opencv-python-headless remi

# 激活虚拟环境
.\.venv\Scripts\activate

2. Remi 前端代码

在day11目录下创建remi_opencv_app.py,其代码如下:

from remi import start, App, gui
import cv2
import numpy as np
import io
import base64

class OpenCVApp(App):
    def __init__(self, *args):
        super(OpenCVApp, self).__init__(*args)

    def main(self):
        # 创建一个垂直布局容器作为根容器
        root_container = gui.VBox(width=800, style={'margin': 'auto', 'padding': '20px', 'border': '1px solid #ccc'})

        # 创建标题标签
        title = gui.Label("图像处理与展示", style={'font-size': '24px', 'text-align': 'center', 'margin-bottom': '20px'})

        # 创建图像容器
        self.original_image = gui.Image(width=400, height=300)
        self.processed_image = gui.Image(width=400, height=300)

        # 创建图像容器布局
        image_container = gui.HBox(width='100%', style={'margin-bottom': '20px'})
        image_container.append(self.original_image)
        image_container.append(self.processed_image)

        # 创建按钮容器
        button_container = gui.HBox(width='100%', style={'margin-bottom': '20px'})

        # 创建加载图像按钮
        load_button = gui.Button("加载图像", width=100, height=30)
        load_button.onclick.do(self.on_load_clicked)

        # 创建灰度化按钮
        grayscale_button = gui.Button("灰度化", width=100, height=30)
        grayscale_button.onclick.do(self.on_grayscale_clicked)

        # 创建边缘检测按钮
        edge_button = gui.Button("边缘检测", width=100, height=30)
        edge_button.onclick.do(self.on_edge_clicked)

        # 将按钮添加到容器中
        button_container.append(load_button)
        button_container.append(grayscale_button)
        button_container.append(edge_button)

        # 将所有组件添加到根容器中
        root_container.append(title)
        root_container.append(image_container)
        root_container.append(button_container)

        # 返回根容器
        return root_container

    def on_load_clicked(self, widget):
        # 加载图像
        self.image = cv2.imread('image.jpg')
        if self.image is None:
            print("无法加载图像,请检查文件路径")
            return
        # 显示原始图像
        self.show_image(self.image, self.original_image)

    def on_grayscale_clicked(self, widget):
        if hasattr(self, 'image'):
            # 灰度化处理
            gray_image = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)

            # 显示处理后的图像
            self.show_image(gray_image, self.processed_image)

    def on_edge_clicked(self, widget):
        if hasattr(self, 'image'):
            # 边缘检测处理
            gray_image = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
            edges = cv2.Canny(gray_image, 100, 200)

            # 显示处理后的图像
            self.show_image(edges, self.processed_image)

    def show_image(self, image, widget):
        # 对于灰度或边缘检测图像,可能需要转换为3通道
        if len(image.shape) == 2:
            image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)

        # 将图像转换为 PNG 格式
        _, buffer = cv2.imencode('.png', image)

        if not _:
            print("图像编码失败")
            return
    
        # 将图像转换为 Base64 编码
        img_str = base64.b64encode(buffer).decode('utf-8')

        # 更新图像组件
        widget.set_image(f"data:image/png;base64,{img_str}")

# 启动 Remi 应用
if __name__ == "__main__":
    start(OpenCVApp, address='0.0.0.0', port=8080)

提示:完整代码(
https://gitcode.com/ICodeWR/StudyFlow/tree/main/src/RemiEg )


运行步骤

准备一张名为 image.jpg 的图像文件,并将其放在与脚本相同的目录下。

启动 Remi 应用:

# 进入day11目录
cd day11

# 执行脚本
python remi_opencv_app.py

打开浏览器,访问 http://127.0.0.1:8080,你将看到一个图像处理与展示应用。

启动后界面:

加载图像后:

灰度化后:

边缘化后效果:


代码解析

  1. OpenCV 图像加载
  • 使用 cv2.imread 加载图像。
  1. 图像处理
  • 使用 cv2.cvtColor 将图像转换为灰度图。
  • 使用 cv2.Canny 进行边缘检测。
  1. 图像显示
  • 使用 cv2.imencode 将图像转换为 PNG 格式。
  • 使用 base64.b64encode 将图像转换为 Base64 编码。
  • 使用 gui.Image.set_image 方法显示图像。
  1. 事件处理
  • 通过 on_load_clicked 方法处理加载图像按钮点击事件。
  • 通过 on_grayscale_clicked 方法处理灰度化按钮点击事件。
  • 通过 on_edge_clicked 方法处理边缘检测按钮点击事件。

总结

今天详细记录了如何将 Remi 与 OpenCV 结合,并通过一个图像处理与展示应用的案例演示了图像处理与展示的实现。在接下来的文章中,我们将深入探讨 Remi 与其他 Python 库的集成。


交流讨论

  1. 你在使用 Remi 与 OpenCV 结合时遇到过哪些问题?欢迎在评论区分享!
  2. 你希望在本系列中看到哪些 Remi 的实际应用场景?欢迎留言告诉我们!

附录:本篇案例用到的函数原型

1. cv2.imread 方法

功能:加载图像文件。
原型

cv2.imread(filename, flags=cv2.IMREAD_COLOR)

示例

image = cv2.imread('image.jpg')

2. cv2.cvtColor 方法

功能:转换图像颜色空间。
原型

cv2.cvtColor(src, code)

示例

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

3. cv2.Canny 方法

功能:进行边缘检测。
原型

cv2.Canny(image, threshold1, threshold2)

示例

edges = cv2.Canny(gray_image, 100, 200)

4. cv2.imencode 方法

功能:将图像编码为指定格式。
原型

cv2.imencode(ext, img, params=None)

示例

_, buffer = cv2.imencode('.png', image)

5. base64.b64encode 方法

功能:将二进制数据编码为 Base64 字符串。
原型

base64.b64encode(data)

示例

img_str = base64.b64encode(buffer).decode('utf-8')

将陆续更新 Python 编程相关的学习资料!

作者:ICodeWR

标签: #编程# #python# #在头条记录我的2025# #春日生活打卡季#


相关推荐

使用opencv-Python进行图像锐化处理

使用OpenCV函数cv::filter2D执行一些拉普拉斯滤波以进行图像锐化使用OpenCV函数cv::distanceTransform以获得二值图像的派生(derived)表示,...

Python-OpenCV 7. 图像二值化

一、介绍图像二值化(ImageBinarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。在数字图像处理中,二值图像占有非常重要的地位,图...

OpenCV+Python裁剪图像

最近使用OpenCV+Python做了一个程序,功能是自动将照片中的文本部分找出来并裁剪/旋转保存为新的图片。这个功能用专业些的说法就是选择并提取感兴趣区域(ROI(RegionofInteres...

简单易懂的人脸识别!用PythonOpenCV实现(适合初...

前言:OpenCV是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包。根据这个项目的关于页面,OpenCV已被广泛运用在各种项目上,从谷歌街景...

OpenCV行人检测应用方案--基于米尔全志T527开发板

本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志T527开发板)的OpenCV行人检测方案测试。摘自优秀创作者-小火苗一、软件环境安装1.在全志T527开发板安装OpenCVsudoap...

纯Python构建Web应用:Remi与 OpenCV 结合实现图像处理与展示

引言大家好,我是ICodeWR。在前几篇文章中,我们介绍了Remi的基础功能、多页面应用、动态更新、与Flask结合、与数据库结合、与Matplotlib结合以及与Pandas结合。...

【AI实战项目】基于OpenCV的“颜色识别项目”完整操作过程

OpenCV是一个广受欢迎且极为流行的计算机视觉库,它因其强大的功能、灵活性和开源特性而在开发者和研究者中备受青睐。学习OpenCV主要就是学习里面的计算机视觉算法。要学习这些算法的原理,知道它们适用...

Python自动化操控术:PyAutoGUI全场景实战指南

一、PyAutoGUI核心武器库解析1.1鼠标操控三剑客importpyautogui#绝对坐标移动(闪电速度)pyautogui.moveTo(100,200,duration=0....

从零开始学python爬虫(七):selenium自动化测试框架的介绍

本节主要学习selenium自动化测试框架在爬虫中的应用,selenium能够大幅降低爬虫的编写难度,但是也同样会大幅降低爬虫的爬取速度。在逼不得已的情况下我们可以使用selenium进行爬虫的编写。...

「干货分享」推荐5个可以让你事半功倍的Python自动化脚本

作者:俊欣来源:关于数据分析与可视化相信大家都听说自动化流水线、自动化办公等专业术语,在尽量少的人工干预的情况下,机器就可以根据固定的程序指令来完成任务,大大提高了工作效率。今天小编来为大家介绍几个P...

python+selenium+pytesseract识别图片验证码

一、selenium截取验证码#私信小编01即可获取大量Python学习资源#私信小编01即可获取大量Python学习资源#私信小编01即可获取大量Python学习资源importjso...

Python爬虫实战 | 利用多线程爬取 LOL 高清壁纸

一、背景介绍随着移动端的普及出现了很多的移动APP,应用软件也随之流行起来。最近看到英雄联盟的手游上线了,感觉还行,PC端英雄联盟可谓是爆火的游戏,不知道移动端的英雄联盟前途如何,那今天我们使用到...

一套真实的Python面试题,几十个题目汇总

1.(1)python下多线程的限制以及多进程中传递参数的方式python多线程有个全局解释器锁(globalinterpreterlock),这个锁的意思是任一时间只能有一个线程使用解释器,跟...

一文读透,Python暴力(BF)字符串匹配算法到 KMP 算法之间的变化

1.字符串匹配算法所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串。如在字符串"ABCDEFG"中查找是否存在“EF”字符串。可以把字符...

Python实现屏幕自动截图

教程目录需要实现的功能:自动屏幕截图具体需求:1.支持设置截图频率和截图文件存储路径2.在存储截图时判断与前一张截图的相似度,只有屏幕发生了显著的变化才存储截图所需技术(搜索关键词):1.屏幕截...