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

news2025/1/14 4:19:21

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.shape
    translation_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.shape
    translation_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.shape
    matrix = 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.shape
    matrix = 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1057942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Transformer学习-self-attention

这里写自定义目录标题 Self-attentionMulti-head self-attention用self-attention解决其他问题 Self-attention 用Wq、Wk、Wv分别乘输入向量得到q、k、v向量 用每个q向量乘所有的k向量得到对应项的attention,即用每项的query向量去匹配所有的key向量,得…

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

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

Leetcode字符串题目

1 sslist(s) ttlist(t) ss.sort() tt.sort() return sstt 时间复杂度更低的代码 2 dict1{} dict2{} for ch in s:dict1[ch]dict1.get(ch,0)1 # 如果有ch,则原有位置加一,没有的话就创建了(01) for ch in t:dict2[ch]dict2.get(ch,0)1 return dict1…

苹果双系统和虚拟机哪个好用?

苹果不能直接使用windows系统中的软件,但windows系统较为全面,为了解决苹果电脑不能使用windows系统软件的问题,使用双系统和类虚拟机是非常不错的解决方案。那么,苹果双系统和虚拟机哪个好?这两种解决方案各有千秋。苹…

105.从前序与中序遍历序列构造二叉树

力扣题目链接(opens new window) 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树: class Solution { public:Tr…

Android学习之路(19) ListView详解

一.ListView简介 在Android开发中&#xff0c;ListView是一个比较常用的控件。它以列表的形式 展示具体数据内容&#xff0c;并且能够根据数据的长度自适应屏幕显示。 二.ListView简单用法 代码部分 1.布局界面 activity_main.xml 代码&#xff1a; <?xml version"…

106.从中序与后序遍历序列构造二叉树

力扣题目链接(opens new window) 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树&#xff1a; class Solution { public:Tr…

堆排序算法---C语言实现(超详细解析!!!!)

目录 一、前言 二、堆排序 &#x1f34e;方法一&#xff08;自己写一个堆&#xff0c;在进行排序&#xff09; &#x1f4a6;时间复杂度分析 &#x1f350;方法二&#xff08;直接在数组上建堆&#xff09; &#x1f4a6;向上调整建堆 &#x1f4a6;向下调整建堆 &a…

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

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

set和map的封装

介绍 set和map的底层都是红黑树,所以我们可以在自己实现的红黑树(简易版)的基础上,进行封装,成为简易的set和map 红黑树代码 #pragma once#include <iostream> #include <vector> #include <string> #include <queue> #include <cassert> #inc…

redis的简单使用

文章目录 环境安装与配置redis发布-订阅相关命令redis发布-订阅的客户端编程redis的订阅发布的例子 环境安装与配置 sudo apt-get install redis-server # ubuntu命令安装redis服务ubuntu通过上面命令安装完redis&#xff0c;会自动启动redis服务&#xff0c;通过ps命令确认&a…

python中dir()和help()的作用

在 Python 中&#xff0c;dir() 和 help() 是两个常用的内置函数&#xff0c;用于获取对象的属性和方法信息以及提供帮助文档。 dir(object) 函数返回一个包含对象 object 的属性和方法名称的列表。如果没有提供参数&#xff0c;则返回当前作用域内的所有名称。例如&#xff0…

分支定界、分支切割、分支定价的区别

目录 1.从原理的角度 &#xff08;1&#xff09;分支定界&#xff1a; &#xff08;2&#xff09;分支切割&#xff1a; &#xff08;3&#xff09;分支定价&#xff1a; 2.从分支树的角度 &#xff08;1&#xff09;分支定界 &#xff08;2&#xff09;分支切割 &…

获取网卡上的IP、网关及DNS信息,获取最佳路由,遍历路由表中的条目(附源码)

VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…

【数组及指针经典笔试题解析】

1.数组和指针笔试题 题目1 int main(){int a[5] { 1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5};int * ptr (int * )(&a 1);printf("%d&#xff0c;%d"&#xff0c;*(a 1)&#xff0c;*(ptr - 1));return 0;}图文解析&#xff1a; int * ptr …

【数据结构】堆的应用-----TopK问题

目录 一、前言 二、Top-k问题 &#x1f4a6;解法一&#xff1a;暴力排序 &#x1f4a6;解法二&#xff1a;建立N个数的堆 &#x1f4a6;解法三&#xff1a;建立K个数的堆&#xff08;最优解&#xff09; 三、完整代码和视图 四、共勉 一、前言 在之前的文章中&#xff…

SpringCloudGateway实现数字签名与URL动态加密

文章目录 对称加密非对称加密什么是数字签名HTTPS与CA⭐Gateway网关的过滤器链如何对自己的路径传输设定一个数字签名&#xff1f;前端获取RSA公钥发送加密后对称密钥后端接收当前会话对称密钥并保存前端发送AES加密请求验证请求 如何实现URL的动态加密&#xff1f; 再网络传递…

HTML开篇之安装VSvode(用记事本编辑HTML)

文章目录 前端开篇开篇知识点讲解1.HTML 结构1.1认识 HTML 标签1.2HTML 文件基本结构1.3标签层次结构1.4快速生成代码框架1.5用记事本写HTML1.6前端开发工具1.7下载vscode 及使用教学 大家好&#xff0c;我是晓星航。今天为大家带来的是 HTML 相关的讲解&#xff01;&#x1f6…

凉鞋的 Unity 笔记 105. 第一个通识:编辑-测试 循环

105. 第一个通识&#xff1a;编辑-测试 循环 在这一篇&#xff0c;我们简单聊聊此教程中所涉及的一个非常重要的概念&#xff1a;循环。 我们在做任何事情都离不开某种循环&#xff0c;比如每天的 24 小时循环&#xff0c;一日三餐循环&#xff0c;清醒-睡觉循环。 在学习一…

在线OJ项目核心思路

文章目录 在线OJ项目核心思路1. 项目介绍2.预备知识理解多进程编程为啥采用多进程而不使用多线程?标准输入&标准输出&标准错误 3.项目实现题目API实现相关实体类定义新增/修改题目获取题目列表 编译运行编译运行流程 4.统一功能处理 在线OJ项目核心思路 1. 项目介绍 …