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

DIP——边缘提取与分割

1.使用canny算法进行边缘提取
本实验比较简单,基本思路是对原图像进行一个高斯模糊处理,用于去噪,之后转换为灰度图,直接调用cv库中的canny记性边缘提取。若想直接得到彩色边缘,则通过按位与操作,将原始彩色图像和Canny边缘图像结合,得到彩色边缘图。具体完整代码如下:

# canny边缘提取实验
import cv2 as cv
import numpy as npdef edge_demo(image):# 对输入的图像进行高斯模糊,去噪,其中高斯核模板大小为3*3,标准差为0blurred = cv.GaussianBlur(image, (3, 3), 0)# 转换为灰度图gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)# 使用Canny边缘检测算法,设置低阈值为50,高阈值为150,提取图像的边缘。经验设定edge_output = cv.Canny(gray, 50, 150)# 在窗口中显示Canny边缘提取的结果图像。cv.imshow('Canny Edge', edge_output)# 彩色边缘提取# 通过按位与操作,将原始彩色图像和Canny边缘图像结合,得到彩色边缘图。dst = cv.bitwise_and(image, image, mask=edge_output)cv.imshow('Color Edge', dst)# 绘图
src = cv.imread('ai.jpg')
cv.namedWindow('input image', cv.WINDOW_AUTOSIZE)
cv.imshow('input image', src)
edge_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

实验结果
原始图像:
在这里插入图片描述
灰度处理后canny算法提取的边缘图像
在这里插入图片描述
彩色边缘图像
在这里插入图片描述
2.使用大津法进行图像分割
本实验的原理也比较简单,使用大津法进行图像分割。大津法(Otsu’s Method)是一种自适应阈值选取的方法,通常用于图像分割。其目标是通过最大化类间方差(类间方差是指分割后的两个类别之间的方差)来找到一个合适的阈值,将图像分为两个类别,一类为前景,一类为背景。这里我们绘制灰度直方图,并且使用OpenCV的threshold函数进行OTSU阈值化。并且将计算得到的阈值存储在 ret1 中,OTSU阈值化后的图像存储在 th1 中。其完整代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as pltimage = cv2.imread("flying_horse.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)plt.figure(figsize=(6, 6))
plt.imshow(image, cmap="gray")
plt.title("Source Image")
plt.xticks([]), plt.yticks([])
plt.show()# 显示直方图
plt.figure(figsize=(6, 6))
# np.histogram 用于计算直方图的频率和边界。
hist, bins = np.histogram(image.ravel(), 256, [0, 256])
plt.plot(hist, color='black')
plt.title("Histogram")
plt.xlabel("Pixel Value")
plt.ylabel("Frequency")
plt.show()# 使用OpenCV的threshold函数进行OTSU阈值化。
# 将计算得到的阈值存储在 ret1 中,OTSU阈值化后的图像存储在 th1 中。
ret1, th1 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)# 显示OTSU阈值化后的图像
plt.figure(figsize=(6, 6))
plt.imshow(th1, cmap="gray")
plt.title("OTSU, Threshold: {}".format(ret1))
plt.xticks([]), plt.yticks([])
plt.show()

实验结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/257369.html

相关文章:

  • 低代码开发:现实挑战与发展前景
  • 大数据技术7:基于StarRocks统一OALP实时数仓
  • C# WPF上位机开发(网络程序界面开发)
  • 卡码网语言基础课 | 20. 排队取奶茶
  • Angular 进阶之四:SSR 应用场景与局限
  • vue2 cron表达式组件
  • git-vscode
  • 【C++11(三)】智能指针详解--RAII思想循环引用问题
  • 佳明(Garmin) fēnix 7X 增加小睡检测功能
  • 二、如何保证架构的质量、架构前期准备、技术填补与崩溃预防、系统重构
  • 14、SQL注入——HTTP文件头注入
  • 李宏毅bert记录
  • .Net6.0 Microsoft.AspNetCore.Http.Abstractions 2.20 已弃用
  • c2-C语言--指针
  • kafka入门(四):消费者
  • DFS、BFS求解leetcode图像渲染问题(Java)
  • 0基础学习云计算难吗?
  • 【RabbitMQ高级功能详解以及常用插件实战】
  • 开源的数据流技术,该选择Redpanda还是Apache Kafka?
  • 720度vr虚拟家居展厅提升客户的参观兴致
  • mysql中的DQL查询
  • 【数据结构高阶】红黑树
  • Unity中Batching优化的GPU实例化(1)
  • vue的data
  • Java基础课的中下基础课04
  • 解决vue ssr服务端渲染运行时报错:net::ERR_PROXY_CONNECTION_FAILED
  • APIFox:打造高效便捷的API管理工具
  • 半导体划片机助力氧化铝陶瓷片切割:科技与工艺的完美结合
  • java访问数据库的库和API概述
  • 如何实现远程公共网络下访问Windows Node.js服务端