纯Python构建Web应用:Remi与 OpenCV 结合实现图像处理与展示
moboyou 2025-05-26 20:02 14 浏览
引言
大家好,我是 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,你将看到一个图像处理与展示应用。
启动后界面:
加载图像后:
灰度化后:
边缘化后效果:
代码解析
- OpenCV 图像加载:
- 使用 cv2.imread 加载图像。
- 图像处理:
- 使用 cv2.cvtColor 将图像转换为灰度图。
- 使用 cv2.Canny 进行边缘检测。
- 图像显示:
- 使用 cv2.imencode 将图像转换为 PNG 格式。
- 使用 base64.b64encode 将图像转换为 Base64 编码。
- 使用 gui.Image.set_image 方法显示图像。
- 事件处理:
- 通过 on_load_clicked 方法处理加载图像按钮点击事件。
- 通过 on_grayscale_clicked 方法处理灰度化按钮点击事件。
- 通过 on_edge_clicked 方法处理边缘检测按钮点击事件。
总结
今天详细记录了如何将 Remi 与 OpenCV 结合,并通过一个图像处理与展示应用的案例演示了图像处理与展示的实现。在接下来的文章中,我们将深入探讨 Remi 与其他 Python 库的集成。
交流讨论
- 你在使用 Remi 与 OpenCV 结合时遇到过哪些问题?欢迎在评论区分享!
- 你希望在本系列中看到哪些 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# #春日生活打卡季#
相关推荐
- Scrcpy:一款免费、功能丰富且实用的Android镜像投屏控制软件
-
随着科技的不断发展,我们的生活中出现了越来越多的智能设备。尤其是智能手机,已经成为了我们日常生活中不可或缺的一部分。然而,有时候我们需要在电脑上操作手机,例如进行应用程序的调试、游戏挂机等。这时,拥有...
- 考公网课资源百度云网盘,公务员国考省考网课视频资源链接
-
考公网课资源百度云网盘,公务员国考省考网课视频资源链接大家好,国考将近,又到一年一度的大家冲刺的时候了,大家准备考公网课资源怎么样呢?今天来聊一聊,就是我作为一个集众多公考劣势于一身的人,是如何通过自...
- 百度推送收录工具【2025最全教程】
-
目录第一步:百度推送token获取第二步:百度推送token填写第三步:导入百度推送链接第四步:开始百度批量链接推送百度推送token获取如下图登录百度站长管理平台获取百度token注:百度token...
- 2025年公务员笔试网课视频资料百度云网盘分享(...
-
2025年公务员笔试网课视频资料百度云网盘分享(国考省考通用)2025年公务员笔试网课视频资料备考,很多小伙伴都开始了准备。有同学询问如何有效进行备考计划。考虑到在职备考的同学较多,我今天给每天有三个...
- 技术控:免百度云客户端突破下载速度
-
首先要说大神们这篇文章你可以忽视了估计方法你早就知道了首先放张图看到小编在没有使用百度云会员登陆的情况下用我们这次要介绍的下载利器IDM下载文件的时候下载速度已经达到了2.1MB/...
- 2022年中级会计师考试各科目网课视频教程百度网盘下载
-
2022年中级会计师各科目精讲班视频课件资料百度云网盘下载中级会计师资料包含:基础班/精讲班/习题班/冲刺班/押题班电子版教材适合有/无基础,需系统学习的考生中级会计师备考资料下载地址:www.34l...
- Python学不会来打我(34)python函数爬取百度图片_附源码
-
随着人工智能和大数据的发展,图像数据的获取变得越来越重要。作为Python初学者,掌握如何从网页中抓取图片并保存到本地是一项非常实用的技能。本文将手把手教你使用Python函数编写一个简单的百度图片...
- 自研雪狼引擎!百度杀毒3.0正式版评测
-
2014年10月22日,百度杀毒3.0正式版终于发布了!相比旧版,百度杀毒3.0最大的两大在于百度自家研发的雪狼杀毒引擎和冰山防御体系。如果说旧版百度杀毒的主打方向是卡巴芯保安全,那么新版的百度杀毒3...
- 百度云抢票功能怎么用 12306抢火车票攻略
-
【PConline资讯】之前我们介绍了多款抢火车票的辅助软件,这一次咱就来说一说百度浏览器出品的“云抢票功能”。百度云抢票(抢票王)功能是百度浏览器针对用户需求设计的抢火车票辅助功能,它具有“网速保...
- vue.js正确使用百度地图的方案
-
方案一:1.在index.html,加入2.在vue.config.js,配置configureWebpack:config=>{config.externals={'BM...
- SEO优化之网站怎么实现百度秒收录
-
何谓“秒收录”?大家可以经常看到,在许多大网站上,发布的新文章和外链在极短的几分钟时间内被百度索引和收录,这种现象称为“秒收”。一个网站要想关键词有排名,必须先收录!同样的一篇文章,收录快的网站,排名...
- 5分钟实现一个百度网盘资源搜索引擎,不用写代码
-
作者:msay来源:https://www.cnblogs.com/mingjiatang/p/6048193.html本文主要介绍如何通过Google的API来定义自己的搜索引擎,并将Google搜...
- 软网推荐:巧用播放器为百度网盘下载提速
-
现在国内可以选择的网络硬盘越来越少,可以选择的也只有百度网盘等极少的几家。但是百度网盘的限制也越来越多,即使是在文件下载方面也做了很多的限制,这样给用户的文件下载造成了非常大的困难。今天笔者就为大家介...
- JavaScript中10个“过时”的API,你的代码里还在用吗?
-
JavaScript作为一门不断发展的语言,其API也在持续进化。新的、更安全、更高效的API不断涌现,而一些旧的API则因为各种原因(如安全问题、性能瓶颈、设计缺陷或有了更好的替代品)被标记为“废...
- HTML5入门
-
什么是HTML5官方概念:HTML5草案的前身名为WebApplications1.0,是作为下一代互联网标准,用于取代html4与xhtml1的新一代标准版本,所以叫html5。它增加了新的标...
- 一周热门
- 最近发表
- 标签列表
-
- curseforge官网网址 (16)
- 外键约束 oracle (36)
- oracle的row number (32)
- 唯一索引 oracle (34)
- oracle in 表变量 (28)
- oracle导出dmp导出 (28)
- oracle 数据导出导入 (16)
- oracle两个表 (20)
- oracle 数据库 字符集 (20)
- oracle修改端口 (15)
- 左连接 oracle (15)
- oracle 转义字符 (14)
- oracle安装补丁 (19)
- matlab归一化 (16)
- 共轭梯度法matlab (16)
- matlab化简多项式 (20)
- 多线程的创建方式 (29)
- 多线程 python (30)
- java多线程并发处理 (32)
- 宏程序代码一览表 (35)
- c++需要学多久 (25)
- c语言编程小知识大全 (17)
- css class选择器用法 (25)
- css样式引入 (30)
- html5和css3新特性 (19)