在Jupyter Notebook上使用Python實現下述代碼的邊緣提取、圖像濾波功能,這個過程中實現某些功能處理出來的圖像可能會有點粗糙。關於opencv庫的安裝可以參考:Python下opencv庫的安裝過程與一些問題匯總。
一、邊緣提取
import cv2#導入opencv庫
#讀取原灰度圖片
image=cv2.imread("test.bmp") cv2.imshow("image", image)#將原圖片命名為“image”顯示出來
#圖像的閾值分割處理,即將圖像處理成非黑即白的二值圖像
ret,image1 = cv2.threshold(image, 80, 255, cv2.THRESH_BINARY) # binary(黑白二值),ret代表閾值,80是低閾值,255是高閾值
cv2.imshow('image1', image1)#將閾值分割處理后的圖片命名為“image1”顯示出來
#二值圖像的反色處理,將圖片像素取反
height,width = image1.shape #返回圖片大小
image2 = image1.copy() for i in range(height): for j in range(width): image2[i,j] = (255-image1[i,j]) cv2.imshow('image2', image2)#將反色處理后的圖片命名為“image2”顯示出來
#邊緣提取,使用Canny函數
image2_3 = cv2.Canny(image2,80,255) #設置80為低閾值,255為高閾值
cv2.imshow('image2_3', image2_3)#將邊緣提取后的圖片命名為“image2_3”顯示出來
#再次對圖像進行反色處理使提取的邊緣為黑色,其余部分為白色,方法同image2
height1,width1 = image2_3.shape image3 = image2_3.copy() for i in range(height1): for j in range(width1): image3[i,j] = (255-image2_3[i,j]) cv2.imshow('image3', image3)#將邊緣提取后反色處理的圖片命名為“image3”顯示出來
cv2.waitKey(0)# 等待鍵盤輸入,不輸入則無限等待
cv2.destroyAllWindows() #銷毀所有窗口
運行結果:





二、圖像濾波
import cv2 import numpy import matplotlib.pyplot as plt from PIL import Image, ImageDraw, ImageFont #用於給圖片添加中文字符
def ImgText_CN(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) fontText = ImageFont.truetype("font/simhei.ttf", textSize, encoding="utf-8") draw.text((left, top), text, textColor, font=fontText) return cv2.cvtColor(numpy.asarray(img), cv2.COLOR_RGB2BGR) #讀取原灰度圖片
src=cv2.imread("test2.bmp") cv2.imshow("src", src)#將原圖片命名為“src”顯示出來
src_cn=ImgText_CN(src, "原圖像", 5, 5, (255, 0, 0), 20) cv2.imshow("src_cn", src_cn)#將添加文字的src命名為“src_cn”並顯示出來 # 均值濾波
des = cv2.blur(src, (5,5)) cv2.imshow("des", des)#將均值濾波處理后的src命名為“des”並顯示出來
des_cn=ImgText_CN(des, "均值濾波", 5, 5, (255, 0, 0), 20) cv2.imshow("des_cn", des_cn)#將添加文字的des命名為“des_cn”並顯示出來 # 中值濾波
med = cv2.medianBlur(src, 5) cv2.imshow("med", med)#將中值濾波處理后的src命名為“med”並顯示出來
med_cn=ImgText_CN(med, "中值濾波", 5, 5, (255, 0, 0), 20) cv2.imshow("med_cn", med_cn)#將添加文字的med命名為“med_cn”並顯示出來 # 高斯濾波
gauss = cv2.GaussianBlur(src,(5,5),0) cv2.imshow("gauss", gauss)#將高斯濾波處理后的src命名為“gauss”並顯示出來
gauss_cn=ImgText_CN(gauss, "高斯濾波", 5, 5, (255, 0, 0), 20) cv2.imshow("gauss_cn", gauss_cn)#將添加文字的gauss命名為“gauss_cn”並顯示出來 # 高斯邊緣檢測
gaussedge = cv2.Canny(gauss,0,50) cv2.imshow("gaussedge", gaussedge)#將邊緣檢測處理后的gauss命名為“gaussedge”並顯示出來
gaussedge_cn=ImgText_CN(gaussedge, "高斯邊緣檢測", 5, 5, (0, 255, 0), 20) cv2.imshow("gaussedge_cn", gaussedge_cn)#將添加文字的gaussedge命名為“gaussedge_cn”並顯示出來
cv2.waitKey(0)
運行結果:






