python opencv圖像的均值濾波、中值濾波和高斯濾波


一、實驗目的

掌握opencv如何實現圖像的均值濾波、中值濾波和高斯濾波。

二、實驗內容

1.題目描述

對圖片test.png進行圖像的均值濾波、中值濾波和高斯濾波,還有高斯邊緣檢測,下面是test.png原圖片。

 

下面需要達到的效果:

 

 

 

 

 

 

 

 

 

 

 

 

2.實現過程

通過對老師發給的代碼進行分析,再在百度上搜索分析,代碼如下:

import cv2  
import numpy as np  
from PIL import Image, ImageDraw, ImageFont

__author__ = "sunjingjing"
#均值濾波
def blur(source):
    
    img = cv2.blur(source, (10,10))

    cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中顏色的hex碼的儲存順序不同
    pilimg = Image.fromarray(cv2img)

    draw = ImageDraw.Draw(pilimg) # 圖片上打印
    font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 參數1:字體文件路徑,參數2:字體大小
    draw.text((0, 0), "均值濾波", (255, 0, 0), font=font) # 參數1:打印坐標,參數2:文本,參數3:字體顏色,參數4:字體

    # PIL圖片轉cv2 圖片
    cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
    cv2.imshow("blur", cv2charimg)
#中值濾波
def medianBlur(source):
    img= cv2.medianBlur(source, 3)
    cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中顏色的hex碼的儲存順序不同
    pilimg = Image.fromarray(cv2img)

    draw = ImageDraw.Draw(pilimg) # 圖片上打印
    font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 參數1:字體文件路徑,參數2:字體大小
    draw.text((0, 0), "中值濾波", (255, 0, 0), font=font) # 參數1:打印坐標,參數2:文本,參數3:字體顏色,參數4:字體
    # PIL圖片轉cv2 圖片
    cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
    cv2.imshow("medianBlur", cv2charimg)
#方框濾波
def BoxFilter(source):

    img = cv2.boxFilter(source, -1, (5,5), normalize=1)
    cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中顏色的hex碼的儲存順序不同
    pilimg = Image.fromarray(cv2img)

    draw = ImageDraw.Draw(pilimg) # 圖片上打印
    font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 參數1:字體文件路徑,參數2:字體大小
    draw.text((0, 0), "方框濾波", (255, 0, 0), font=font) # 參數1:打印坐標,參數2:文本,參數3:字體顏色,參數4:字體
    # PIL圖片轉cv2 圖片
    cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
    cv2.imshow("boxFilter", cv2charimg)
#高斯濾波
def GaussianBlur(source):
    img = cv2.GaussianBlur(source, (3,3), 0)
    cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中顏色的hex碼的儲存順序不同
    pilimg = Image.fromarray(cv2img)

    draw = ImageDraw.Draw(pilimg) # 圖片上打印
    font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 參數1:字體文件路徑,參數2:字體大小
    draw.text((0, 0), "高斯濾波", (255, 0, 0), font=font) # 參數1:打印坐標,參數2:文本,參數3:字體顏色,參數4:字體
    # PIL圖片轉cv2 圖片
    cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
    cv2.imshow("GaussianBlur", cv2charimg)

#高斯邊緣檢測
def Gaussian(source):
    sobelX = cv2.Sobel(source,cv2.CV_64F,1,0)#x方向的梯度
    sobelY = cv2.Sobel(source,cv2.CV_64F,0,1)#y方向的梯度
    
    sobelX = np.uint8(np.absolute(sobelX))#x方向梯度的絕對值
    sobelY = np.uint8(np.absolute(sobelY))#y方向梯度的絕對值

    img = cv2.bitwise_or(sobelX,sobelY)#
    cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中顏色的hex碼的儲存順序不同
    pilimg = Image.fromarray(cv2img)

    draw = ImageDraw.Draw(pilimg) # 圖片上打印
    font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 參數1:字體文件路徑,參數2:字體大小
    draw.text((0, 0), "高斯邊緣檢測", "green", font=font) # 參數1:打印坐標,參數2:文本,參數3:字體顏色,參數4:字體

    # PIL圖片轉cv2 圖片
    cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
    cv2.imshow("GaussianBlur", cv2charimg)

if __name__ == "__main__":
    #加載圖片
    img = cv2.imread("test2.png")
    cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
    cv2.imshow("input image", img)
    blur(img)
    medianBlur(img)
    GaussianBlur(img)
    # Gaussian(img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

3.運行結果

 

 

 

 

 

 

 

 

 

4.問題及解決方法

問題:沒有辦法將中文寫在圖片上,一有中文就亂碼

解決方法:在百度上搜索,發現要寫上中文,要設置漢字的字體顏色和坐標將漢字沾在圖片上。也就是下面這幾行代碼

 

三、實驗總結

通過這次的作業,我發現opencv真的沒有xavis 好用,xavis短短幾行代碼,但在pythonC語言中就需要很多行,不過opencv是開源的,比較方便。還有網絡促進了社會進步,在網上我可以找到自己需要的東西,也可以自己去學習機器視覺方面的知識。總之對機器視覺有了更深的了解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM