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

这篇具有很好参考价值的文章主要介绍了图像处理初学者导引---OpenCV 方法演示项目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OpenCV 方法演示项目

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

图像处理初学者导引---OpenCV 方法演示项目,开源项目,图像处理,opencv,开源,github,开源软件,原力计划


项目简介

这个开源项目是一个用于演示 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. 使用界面:在浏览器中,你可以上传图像并选择不同的处理方法和参数,然后查看处理后的图像效果。


示例代码

图像处理初学者导引---OpenCV 方法演示项目,开源项目,图像处理,opencv,开源,github,开源软件,原力计划

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

# 灰度化处理函数
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

贡献

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


源代码

如果你不想克隆项目,也可以直接运行我的源代码:文章来源地址https://www.toymoban.com/news/detail-728651.html

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)

到了这里,关于图像处理初学者导引---OpenCV 方法演示项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通过 Midjourney 彻底改变您的平面设计:AI 图像生成初学者指南

    AI 生成的艺术作品正在兴起。随着机器学习和神经网络的进步,人工智能越来越有能力创建高质量、逼真的图像。目前最流行的 AI 图像生成工具之一是 Midjourney。 RTX 3070 Ti 与 RTX 2080 Ti:2023 年哪个更好? Midjourney 为您提供了强大的功能,可以根据您的描述性输入生成令人惊叹

    2024年02月09日
    浏览(62)
  • 初学者使用Xcode的一些问题解决,以及A function declaration without a prototype is deprecated in all versions of C处理

    今天我使用Xcode创建了一个项目,并在其中生成了一个.c文件。这个文件运行起来没有问题,于是我生成了第二个.c文件,发现编译错误。 原因是Xcode每个target都只能有一个main函数,如果需要在一个项目内创建互不影响的小项目,应该使用创建target的方式,否则会报错。 另外

    2024年01月17日
    浏览(34)
  • 爬虫,初学者指南

    1.想目标地址发起请求,携带heards和不携带heards的区别 request模块用于测速发送数据的连通性,通过回复可以看出418,Connection:close表示未获取到服务器的返回值,需要添加heards信息,此服务器拒绝非浏览器发送的请求。 上图可以看出添加了头信息headers之后成功获取了返回值

    2024年02月07日
    浏览(59)
  • 守护进程(初学者必备)

    目录 一.进程组和会话 二.守护进程的概念 三.守护线程的特点 四.守护进程创建的基本步骤 1.进程组的相关概念: 进程除了有进程的PID之外还有一个进程组,进程组是由一个进程或者多个进程组成。通常他们与同一作业相关联可以收到同一终端的信号 每个进程组有唯一的进程

    2024年02月08日
    浏览(60)
  • Groovy初学者指南

    本文已收录至Github,推荐阅读 👉 Java随想录 微信公众号:Java随想录 目录 摘要 Groovy与Java的联系和区别 Groovy的语法 动态类型 元编程 处理集合的便捷方法 闭包 运算符重载 控制流 条件语句 循环语句 字符串处理 字符串插值 多行字符串 集合与迭代 列表(List) 映射(Map) 迭代器

    2024年02月05日
    浏览(62)
  • ChatGPT初学者最佳实践

    2022年11月底,ChatGPT引爆了新一轮AI的革命,也让人们意识到AI真的能够大幅度提高人们的工作效率,甚至有人担心自己的工作会因为AI不保。这种居安思危的意识是正确的,但是正如锛凿斧锯的出现,并没有让木匠这个行业消失,而是让这个行业以更高效的方式工作。所以作为

    2024年02月05日
    浏览(51)
  • linux初学者小命令

    进程 :进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。 bash执行命令的过程,以’ls’命令为例: 第一步. 读取输入信息 :shell通过STDIN(标准输入)的getline()函数得到用户的输入

    2024年02月13日
    浏览(46)
  • QuantumultX 初学者傻瓜教程

    我这里以“orz”大佬来介绍。 大佬集成了分流、策略、去广告、比价、boxjs等功能,并给了非常详细的任务订阅列表,非常方便。 项目地址:https://github.com/Orz-3/QuantumultX TG频道:https://t.me/Orzmini TG群组:https://t.me/Orz_mini 食用方法:就是把远程配置文件下到本地覆盖再进行设置

    2024年02月08日
    浏览(45)
  • C语言初学者自序

    在这篇博客的开头,我首先说明,本人是金融专业大一的菜鸟。为什么会学习C语言以及与计算机的不解之缘,我会在下面一一解答。 我与计算机的故事,得从我幼年时说起。当然,这不是老太婆裹脚——又臭又长的故事。毕竟我自己也时时回顾这段经历,它有如晨钟暮鼓。

    2023年04月09日
    浏览(40)
  • 初学者关于ConvLSTM的理解

    最近在着手于使用ConvLSTM进行时空序列预测问题,由于本人刚接触深度学习,很多代码都还理不清,故想到自己通过记录来加深对模型的理解,肯定会有很多问题和不专业的地方,若有网友看见,请不吝指教,谢谢。 ConvLSTM是施博士在《Convolutional LSTM Network: A Machine Learning Ap

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包