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()
實驗結果: