1.實驗目的
利用opencv python實作對下圖實作邊緣檢測算子,

2.實驗程序
(1)在python安裝opencv庫, pip install opencv-python,
(2)在python安裝Pillow庫, pip install Pillow,同理,安裝Numpy庫,
(3)撰寫代碼
代碼如下:
import cv2
import numpy
import cv2 as cv
import numpy as np
from PIL import Image, ImageDraw, ImageFont
# coding=utf-8
# cv2解決繪制中文亂碼
def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20):
if (isinstance(img, numpy.ndarray)): # 判斷是否OpenCV圖片型別
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# 創建一個可以在給定影像上繪圖的物件
draw = ImageDraw.Draw(img)
# 字體的格式
fontStyle = ImageFont.truetype("font/simsun.ttc", textSize, encoding="utf-8")
# 繪制文本
draw.text((left, top), text, textColor, font=fontStyle)
# 轉換回OpenCV格式
return cv2.cvtColor(numpy.asarray(img), cv2.COLOR_RGB2BGR)
#影像反色
def inverse_color(image):
height,width,temp = image.shape
img2 = image.copy()
for i in range(height):
for j in range(width):
img2[i,j]=(255-image[i,j][0],255-image[i,j][1],255-image[i,j][2])
return img2
#讀取影像
src = cv2.imread("dip_switch_02.bmp")
#反色
one = inverse_color(src)
#加入文本資訊
image1=cv2ImgAddText(one,"原影像",5, 5, (255, 0, 0), 20)
#顯示圖片
cv2.imshow("image1",image1)
#sobel算子邊緣檢測
sobelx = cv2.Sobel(one,cv2.CV_16S,1,0)
sobely = cv2.Sobel(one,cv2.CV_16S,0,1)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.convertScaleAbs(sobely)
sobelXY = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
tow=inverse_color(sobelXY)
image2=cv2ImgAddText(tow,"sobel算子邊緣檢測結果",5, 5, (255, 0, 0), 20)
cv2.imshow("image2",image2)
#robert算子邊緣檢測
kernelx = np.array([[-1,0],[0,1]], dtype=int)
kernely = np.array([[0,-1],[1,0]], dtype=int)
x = cv2.filter2D(one, cv2.CV_16S, kernelx)
y = cv2.filter2D(one, cv2.CV_16S, kernely)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Roberts = cv2.addWeighted(absX,0.5,absY,0.5,0)
three=inverse_color(Roberts)
image3=cv2ImgAddText(three,"robert算子邊緣檢測結果",5, 5, (255, 0, 0), 20)
cv2.imshow("image3",image3)
#gauss算子邊緣檢測
gray_lap=cv2.Laplacian(one,cv2.CV_16S,ksize=5)
gauss_img=cv2.convertScaleAbs(gray_lap)
dst3=cv2.bitwise_not(gauss_img)
image4=cv2ImgAddText(dst3,"gauss算子邊緣檢測結果",5, 5, (255, 0, 0), 20)
cv2.imshow("image4",image4)
cv2.waitKey(0)# 等待鍵盤輸入,不輸入則無限等待
cv2.destroyAllWindows()
3.運行結果
運行結果如下圖所示,
圖3.1 原影像

圖3.2 sobel算子邊緣檢測結果

圖3.3 robert算子邊緣檢測結果

圖3.4 gauss算子邊緣檢測結果
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290977.html
標籤:其他
上一篇:數字影像處理——頻域濾波基礎
下一篇:opencv攝像頭例外處理
