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

图像处理初学者导引---OpenCV 方法演示项目

OpenCV 方法演示项目

项目地址:https://github.com/WangQvQ/opencv-tutorial

请添加图片描述


项目简介

这个开源项目是一个用于演示 OpenCV 方法的工具,旨在帮助初学者快速理解和掌握 OpenCV 图像处理技术。通过这个项目,你可以轻松地对图像进行各种处理,从灰度化到边缘检测,以及更多其他方法。项目使用 Gradio 创建用户友好的界面,让用户能够轻松选择不同的图像处理方法和参数。


为什么选择这个项目

  • 教育性:这个项目的主要目的是教育。它提供了对 OpenCV 方法的实际演示,以帮助初学者更好地理解和掌握这些技术。

  • 互动性:通过 Gradio 创建的用户界面,用户可以立即看到不同处理方法的效果,并可以自己调整参数,以更深入地理解每种方法的工作原理。

  • 适用广泛:这个项目可以帮助广大初学者,无论是学习计算机视觉、图像处理,还是对 OpenCV 有兴趣的人都会受益。


特性

  • 提供了多种 OpenCV 图像处理方法的演示,包括灰度化、反转颜色、平移、直方图均衡化、腐蚀、膨胀、均值滤波、中值滤波、高斯滤波等。

  • 支持自定义卷积核,允许用户尝试不同的卷积核来处理图像。

  • 提供图像旋转、仿射变换和透射变换的演示,以及选择角度和参数的选项。

  • 使用 Gradio 创建用户友好的界面,让用户能够轻松选择不同的图像处理方法和参数。


使用方法

  1. 获取项目:首先,你需要将这个项目克隆到你的本地计算机上。你可以使用以下命令来获取项目:

    git clone https://github.com/WangQvQ/opencv-tutorial.git
    
  2. 安装依赖项:确保你已经安装了以下依赖项:

    • OpenCV
    • Gradio
    • NumPy

    如果你没有安装它们,你可以使用以下命令安装:

    pip install opencv-python-headless=4.7.0.72 gradio=3.1.5 numpy=1.22.4
    
  3. 运行项目:使用以下命令来运行项目:

    python opencv_demo.py
    

    运行后,你将看到一个网址,通常是 http://localhost:7860,你可以在浏览器中访问它。

  4. 使用界面:在浏览器中,你可以上传图像并选择不同的处理方法和参数,然后查看处理后的图像效果。


示例代码

请添加图片描述

以下是部分方法的代码示例:

# 灰度化处理函数
def grayscale(input_image):gray_image = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)return gray_image# 平移图像处理函数
def translate_image(input_image, translation_x, translation_y):rows, cols, _ = input_image.shapetranslation_matrix = np.float32([[1, 0, translation_x], [0, 1, translation_y]])translated_image = cv2.warpAffine(input_image, translation_matrix, (cols, rows))return translated_image# Canny 边缘检测处理函数
def edge_detection(input_image):edges = cv2.Canny(input_image, 100, 200)return edges

贡献

如果你对项目有任何改进或建议,欢迎贡献代码或提出问题。我们欢迎开发者共同改进这个项目,以使其更加有用和友好。


源代码

如果你不想克隆项目,也可以直接运行我的源代码:

import cv2  
import gradio as gr  
import numpy as np  # 原始图像处理函数
def original_image(input_image):return input_image# 灰度化处理函数
def grayscale(input_image):gray_image = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)return gray_image# 平移图像处理函数
def translate_image(input_image, translation_x, translation_y):rows, cols, _ = input_image.shapetranslation_matrix = np.float32([[1, 0, translation_x], [0, 1, translation_y]])translated_image = cv2.warpAffine(input_image, translation_matrix, (cols, rows))return translated_image# Canny 边缘检测处理函数
def edge_detection(input_image):edges = cv2.Canny(input_image, 100, 200)return edges# Sobel 边缘检测处理函数
def sobel_edge_detection(input_image):gray_image = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)sobel_x = cv2.Sobel(gray_image, cv2.CV_64F, 1, 0, ksize=5)sobel_y = cv2.Sobel(gray_image, cv2.CV_64F, 0, 1, ksize=5)sobel_magnitude = cv2.magnitude(sobel_x, sobel_y)sobel_magnitude = np.uint8(255 * sobel_magnitude / np.max(sobel_magnitude))return sobel_magnitude# 反转颜色处理函数
def invert_colors(input_image):inverted_image = cv2.bitwise_not(input_image)return inverted_image# 腐蚀处理函数
def erosion(input_image, iterations):kernel = np.ones((5, 5), np.uint8)eroded_image = cv2.erode(input_image, kernel, iterations=iterations)return eroded_image# 膨胀处理函数
def dilation(input_image, dilation_iterations):kernel = np.ones((5, 5), np.uint8)dilated_image = cv2.dilate(input_image, kernel, iterations=dilation_iterations)return dilated_image# 均值滤波处理函数
def mean_blur(input_image):mean_blurred_image = cv2.blur(input_image, (5, 5))return mean_blurred_image# 中值滤波处理函数
def median_blur(input_image):median_blurred_image = cv2.medianBlur(input_image, 5)return median_blurred_image# 高斯滤波处理函数
def gaussian_blur(input_image):gaussian_blurred_image = cv2.GaussianBlur(input_image, (5, 5), 0)return gaussian_blurred_image# 双边滤波处理函数
def bilateral_filter(input_image):bilateral_filtered_image = cv2.bilateralFilter(input_image, 9, 75, 75)return bilateral_filtered_image# 方块滤波处理函数
def box_filter(input_image):box_filtered_image = cv2.boxFilter(input_image, -1, (5, 5))return box_filtered_image# 直方图均衡化处理函数
def histogram_equalization(input_image):gray_image = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)equalized_image = cv2.equalizeHist(gray_image)return cv2.cvtColor(equalized_image, cv2.COLOR_GRAY2BGR)# 仿射变换处理函数
def affine_transform(input_image):# 创建仿射变换矩阵rows, cols, _ = input_image.shapematrix = cv2.getRotationMatrix2D((cols / 4, rows / 2), 70, 0.5)  # 90度旋转和1.5倍缩放result_image = cv2.warpAffine(input_image, matrix, (cols, rows))return result_image# 透射变换处理函数
def perspective_transform(input_image):# 定义四个输入图像的角点坐标rows, cols, _ = input_image.shape# 修改pts1和pts2的值以减小透射变换的弯曲程度pts1 = np.float32([[0, 0], [cols, 0], [0, rows], [cols, rows]])pts2 = np.float32([[30, 30], [cols - 50, 50], [50, rows - 50], [cols - 50, rows - 50]])# 计算投射矩阵matrix = cv2.getPerspectiveTransform(pts1, pts2)# 进行投射变换result_image = cv2.warpPerspective(input_image, matrix, (cols, rows))return result_image# 自定义卷积核
def custom_filter(input_image):kernel = np.array([[-1, -1, -1], [-1, 9, -1], [-1, -1, -1]])return cv2.filter2D(input_image, -1, kernel)# 图像旋转处理函数
def rotate_image(input_image, rotation_angle):rows, cols, _ = input_image.shapematrix = cv2.getRotationMatrix2D((cols / 2, rows / 2), rotation_angle, 1)result_image = cv2.warpAffine(input_image, matrix, (cols, rows))return result_image# 创建 Gradio 接口
input_image = gr.inputs.Image()
method = gr.inputs.Radio(choices=["原图", "灰度化", "反转颜色", "平移", "直方图均衡化", "腐蚀", "膨胀", "均值滤波", "中值滤波", "高斯滤波","双边滤波", "方块滤波", "仿射变换", "透射变换", "图像旋转", "Sobel边缘检测", "Canny边缘检测", "自定义卷积核"], default="原图")rotation_angle = gr.inputs.Slider(minimum=-180, maximum=180, default=45, label="图像旋转: 旋转角度")
iterations = gr.inputs.Slider(minimum=0, maximum=10, step=1, default=1, label="腐蚀: 腐蚀参数")
dilation_iterations = gr.inputs.Slider(minimum=0, maximum=10, step=1, default=1, label="膨胀: 膨胀参数")
translation_x = gr.inputs.Slider(minimum=-200, maximum=200, default=200, label="平移: X轴平移")
translation_y = gr.inputs.Slider(minimum=-200, maximum=200, default=200, label="平移: Y轴平移")output_image = gr.outputs.Image(type="pil")# 创建函数根据下拉菜单的选择来执行不同的方法
def apply_opencv_methods(input_image, method, rotation_angle, iterations, dilation_iterations,translation_x, translation_y):if method == "原图":return original_image(input_image)elif method == "图像旋转":return rotate_image(input_image, rotation_angle)elif method == "腐蚀":return erosion(input_image, iterations)elif method == "膨胀":return dilation(input_image, dilation_iterations)elif method == "Sobel边缘检测":return sobel_edge_detection(input_image)elif method == "平移":return translate_image(input_image, translation_x, translation_y)elif method == "自定义卷积核":return custom_filter(input_image)else:methods = {"灰度化": grayscale,"Canny边缘检测": edge_detection,"反转颜色": invert_colors,"均值滤波": mean_blur,"中值滤波": median_blur,"高斯滤波": gaussian_blur,"双边滤波": bilateral_filter,"方块滤波": box_filter,"仿射变换": affine_transform,"透射变换": perspective_transform,"直方图均衡化": histogram_equalization,}return methods[method](input_image)# 创建 Gradio 接口
gr.Interface(fn=apply_opencv_methods,inputs=[input_image, method, rotation_angle, iterations, dilation_iterations, translation_x,translation_y],outputs=output_image,live=True,title="图像处理初学者导引",description="选择一张图像, 并选择对应方法"
).launch(share=False)

相关文章:

图像处理初学者导引---OpenCV 方法演示项目

OpenCV 方法演示项目 项目地址:https://github.com/WangQvQ/opencv-tutorial 项目简介 这个开源项目是一个用于演示 OpenCV 方法的工具,旨在帮助初学者快速理解和掌握 OpenCV 图像处理技术。通过这个项目,你可以轻松地对图像进行各种处理&a…...

管道-匿名管道

一、管道介绍 管道(Pipe)是一种在UNIX和类UNIX系统中用于进程间通信的机制。它允许一个进程的输出直接成为另一个进程的输入,从而实现数据的流动。管道是一种轻量级的通信方式,用于协调不同进程的工作。 1. 创建和使用管道&#…...

【JavaEE基础学习打卡08】JSP之初次认识say hello!

目录 前言一、JSP技术初识1.动态页面2.JSP是什么3.JSP特点有哪些 二、JSP运行环境配置1.JDK安装2.Tomcat安装 三、编写JSP1.我的第一个JSP2.JSP执行过程3.在IDEA中开发JSP 总结 前言 📜 本系列教程适用于JavaWeb初学者、爱好者,小白白。我们的天赋并不高…...

使用序列到序列深度学习方法自动睡眠阶段评分

深度学习方法,用于使用单通道脑电图进行自动睡眠阶段评分。 def build_firstPart_model(input_var,keep_prob_0.5):# List to store the output of each CNNsoutput_conns []######### CNNs with small filter size at the first layer ########## Convolutionnetw…...

【算法】排序——选择排序和交换排序(快速排序)

主页点击直达:个人主页 我的小仓库:代码仓库 C语言偷着笑:C语言专栏 数据结构挨打小记:初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记:LeetCode刷题 算法头疼记:算法专栏…...

Docker 容器监控 - Weave Scope

Author:rab 目录 前言一、环境二、部署三、监控3.1 容器监控 - 单 Host3.2 容器监控 - 多 Host 总结 前言 Docker 容器的监控方式有很多,如 cAdvisor、Prometheus 等。今天我们来看看其另一种监控方式 —— Weave Scope,此监控方法似乎用的人…...

Spring Boot集成redis集群拓扑动态刷新

项目场景: Spring Boot集成Redis集群,使用lettuce连接Cluster集群实例。 问题描述 redis其中一个节点挂了之后,springboot集成redis集群配置信息没有及时刷新,出现读取操作报错。 java.lang.IllegalArgumentException: Connec…...

COCI2022-2023#1 Neboderi

P9032 [COCI2022-2023#1] Neboderi 题目大意 有一个长度为 n n n的序列 h i h_i hi​,你需要从中选择一个长度大于等于 k k k的子区间 [ l , r ] [l,r] [l,r],使得 g ( h l h l 1 ⋯ h r ) g\times (h_lh_{l1}\cdotsh_r) g(hl​hl1​⋯hr​)最小&…...

由于找不到d3dx9_43.dll无法继续执行此代码怎么解决?全面解析d3dx9_43.dll

在使用计算机过程中,我们可能会遇到各种各样的问题。其中之一就是d3dx9_43.dll文件丢失的问题。这个问题通常会出现在运行某些应用程序或游戏时,导致程序无法正常启动或运行。那么,如何解决这个问题呢?小编将为您提供一些解决方案…...

Linux--网络编程-字节序

进程间的通信: 管道、消息队列、共享内存、信号、信号量。 特点:都依赖于linux内核。 缺陷:无法多机通信。 一、网络编程: 1、地址:基于网络,ip地址端口号。 端口号作用: 一台拥有ip地址的主机…...

python实现http/https拦截

python实现http拦截 前言:为什么要使用http拦截一、技术调研二、技术选择三、使用方法前言:为什么要使用http拦截 大多数爬虫玩家会直接选择API请求数据,但是有的网站需要解决扫码登录、Cookie校验、数字签名等,这种方法实现时间长,难度高。需求里面不需要高并发,有没有…...

农产品团购配送商城小程序的作用是什么

农产品覆盖稻麦油蛋等多种细分类目,各地区经营商家众多,随着人们生活品质提升,对食物的要求也在提升,绿色无污染无激素的农产品往往受到不少人喜爱,而在销售中,也有不少人选择自建商城线上经营。 通过【雨…...

使用van-dialog二次封装微信小程序模态框

由于微信小程序的wx.showModal不支持富文本内容&#xff0c;无法实现更灵活的展示效果&#xff0c;故需要进行二次封装 实现思路&#xff1a;使用van-dialog以及微信小程序的rich-text实现 代码如下&#xff1a; // index.wxml <van-dialoguse-slottitle"提示"s…...

生鲜蔬果同城配送社区团购小程序商城的作用是什么

生鲜蔬果行业作为市场主要支撑之一&#xff0c;从业商家众多的同时消费者也从不缺&#xff0c;尤其对中高城市&#xff0c;生鲜蔬果除了传统线下超市、市场经营外&#xff0c;线上更是受到大量消费者信任&#xff0c;而很多商家也是自建了生鲜蔬果商城多场景生意经营。 那么通…...

Unity实现设计模式——状态模式

Unity实现设计模式——状态模式 状态模式最核心的设计思路就是将对象的状态抽象出一个接口&#xff0c;然后根据它的不同状态封装其行为&#xff0c;这样就可以实现状态和行为的绑定&#xff0c;最终实现对象和状态的有效解耦。 在实际开发中一般用到FSM有限状态机的实现&…...

差分数组的应用技巧

前缀和技巧 针对的算法场景是不需要对原始数组进行修改的情况下&#xff0c;频繁查询某个区间的累加和。 差分数组 主要适用场景是频繁对原始数组的某个区间的元素进行增减。 相关题目 1094. 拼车 1109. 航班预订统计 370. 区间加法 # 1094. 拼车 class Solution:def carPool…...

斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 10 Mining Social-Network Graphs

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT。 Chapter 10 Mining Social-Network Graphs The essential characteristics of a social network are: There is a collection of entities that participate in the network. Typically, these entiti…...

DFS:842. 排列数字

给定一个整数 nn&#xff0c;将数字 1∼n1∼n 排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;请你按照字典序将所有的排列方法输出。 输入格式 共一行&#xff0c;包含一个整数 nn。 输出格式 按字典序输出所有排列方案&#xff0c;每个方案占一行。 数据…...

pytorch之nn.Conv1d详解

自然语言处理中一个句子序列&#xff0c;一维的&#xff0c;所以使用Conv1d...

H5生成二维码

H5生成二维码&#xff1a; 1.引入js库&#xff0c;可自行点击链接复制使用 <script type"text/javascript" src"http://static.runoob.com/assets/qrcode/qrcode.min.js"></script>2.加入二维码占位区HTML <div id"qrCode">…...

Three.js加载360全景图片/视频

Three.js加载360全景图片/视频 效果 原理 将全景图片/视频作为texture引入到three.js场景中将贴图与球形网格模型融合&#xff0c;将球模型当做成环境容器使用处理视频时需要以dom为载体&#xff0c;加载与控制视频动作每次渲染时更新当前texture&#xff0c;以达到视频播放效…...

北大硕士7年嵌入式学习经验分享

阶段 1 大一到大三这个阶段我与大多数学生相同&#xff1a; 学习本专业知识&#xff08;EE专业&#xff09;&#xff0c;学习嵌入式软件开发需要的计算机课程&#xff08;汇编原理&#xff0c;计算机组成原理&#xff0c;操作系统&#xff0c;C语言等&#xff09;&#xff0c…...

华为鸿蒙手表开发之动态生成二维码

华为鸿蒙手表开发之动态生成二维码 前言&#xff1a; 最近入职新公司&#xff0c;由于之前的哥们临时离职&#xff0c;走得很突然&#xff0c;所以没有任何交接和文档&#xff0c;临时顶上公司手表应用的上架&#xff0c;更换了新的密钥和key之后重新测试功能和流程&#xff…...

2023-09-28 monetdb-databae的概念和作用-分析

摘要: 每个数据库对于db,schema以及user,role都有一套自己的设计, 不同数据库间对于相同名字的东西例如database和schema可以说南辕北辙, 例如mysql中schema其实是database的同义词. 本文分析monetdb的database的概念和作用 database的概念和作用: 和mysql的database完全不同…...

2024级199管理类联考之数学基础(上篇)

管理类考试介绍 管理综合200分,时间3小时 数学&#xff1a;75分/25题,是拉开差距的核心模块 问题求解题&#xff1a;15个,5选一条件充分性判断&#xff1a;10个,结合两个条件选择答案 条件一充分,条件二不充分&#xff1a;A条件一不充分,条件二充分&#xff1a;B条件一充分,条…...

RFID技术引领汽车零部件加工新时代

RFID技术的兴起引领了汽车零部件加工领域的新时代&#xff0c;作为一种利用无线电频率进行自动识别的技术&#xff0c;RFID技术能够快速、准确地识别物体并获取相关数据&#xff0c;在汽车零部件加工中&#xff0c;RFID技术具有重要的应用价值&#xff0c;可以提高生产效率、降…...

python中使用matplotlib绘图

一、背景 当我们在写python程序时&#xff0c;不可避免的需要将数据可视化&#xff0c;也就是绘制出数据的曲线图&#xff0c;以便我们更直观的观察数据间的变化&#xff0c;和方便对比。此时就要用到matplotlib库了。 matplotlib官方给出的定义是&#xff1a; 翻译过来也就是…...

Qt Creator 使用技巧

使用技巧 功能快捷键解释Switch Header/SourceF4在同名的头文件和源程序文件之间切换Follow Symbol Under CursorF2变量:跳转到声明;函数:声明和定义切换Refactor Rename Symbol Under CursorCtrlShiftR改名称&#xff0c;将替换所有用到这个符号的地方RefactorAdd Definition…...

来看看双阶段目标检测算法趴

&#x1f680; 作者 &#xff1a;“码上有钱” &#x1f680; 文章简介 &#xff1a;AI-目标检测算法 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac;简介 双阶段目标检测算法是一类深度学习算法&#xff0c;通常分为两个阶段来检测和识别图像中的…...

python利用matplotlib绘图,对于中文和负号不显示,显示方框“口口”完美解决办法!!

文章目录 一、问题展示二、问题分析三、解决办法四、结果展示 一、问题展示 二、问题分析 可以发现对中文&#xff0c;以及负号不显示。 三、解决办法 import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [usimHei] # 显示中文 plt.rcParams[axes.unicode_mi…...

化妆品企业网站建设的策划方案/首页关键词排名代发

我在开发Winform程序时&#xff0c;发现将窗体双击标题栏放大后&#xff0c;会出现大量的空白处&#xff0c;相当丑陋呀 然后在网上查了查怎么禁止这样的命令 以VB.net为例 禁止双击标题栏修改大小 Protected Overrides Sub WndProc(ByRef m As Message)拦截双击标题栏的系统…...

网站规划包括哪些内容/怎么在线上推广自己的产品

SVD—matlab,python,scikit-learn 操作对比1.简介SVD的用途有两个&#xff0c;第一个是降噪&#xff0c;第二个是pca主成分分析&#xff0c;但每个包和语言都有不同的方法&#xff0c;所以在这里一一总结2.matlab机器学习实战方法x[1,1,1,0,0;2,2,2,0,0;1,1,1,0,0;5,5,5,0,0;1,…...

海南省住房和建设厅网站首页/seo行业岗位

羽毛球鞋什么牌子好写回答 共76个回答PINKY5567LV.4 推荐于 2018-02-27YONEX的球鞋产品线最多&#xff0c;推广最好&#xff0c;性能和脚感也是顶尖的&#xff0c;如果买来送人&#xff0c;首选建议是YONEX。&#xff08;现在最好的鞋是01LTD、F1NLTD、65X、86LTD、SC6i等等&am…...

移动网站建设哪家好/免费数据分析网站

//程序存在bug&#xff0c;会不断占用内存直到死机//是malloc函数的问题/**************************************************** 文件名&#xff1a;pthread_server.c* 文件描述&#xff1a;创建子线程来接收客户端的数据***************************************************…...

海城 网站建设/营销新闻

连接方法请移步这里 http://www.cnblogs.com/hangxin1940/archive/2013/04/05/3000395.html 这里使用Python的curses包开发cli窗口程序,用来实时刷新传感器的读数 最终的效果 ![gy85](http://images.cnblogs.com/cnblogs_com/hangxin1940/466697/o_GY-85.jpg "gy85")…...

网站服务器是网站的空间吗/推广网站排名

前言 Apollo是携程框架部门研发的开源配置管理中心&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端。本文介绍了配置的概念、配置中心的必要性以及Apollo的特点&#xff0c;着重拆解分析Apollo客户端的设计原理&#xff0c…...