赞
踩
1.使用canny算法进行边缘提取
本实验比较简单,基本思路是对原图像进行一个高斯模糊处理,用于去噪,之后转换为灰度图,直接调用cv库中的canny记性边缘提取。若想直接得到彩色边缘,则通过按位与操作,将原始彩色图像和Canny边缘图像结合,得到彩色边缘图。具体完整代码如下:
# canny边缘提取实验 import cv2 as cv import numpy as np def edge_demo(image): # 对输入的图像进行高斯模糊,去噪,其中高斯核模板大小为3*3,标准差为0 blurred = 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 plt image = 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()
实验结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。