1. 程式人生 > 其它 >利用卷積對影象進行模糊處理

利用卷積對影象進行模糊處理

若cv.imread('圖片路徑') 這個圖片路徑錯了,就會報錯error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

詳細文章轉自該博主博文
卷積:就是對於某一位置的畫素,通過演算法來把它附近的所有畫素點的值聯合起來,重新設定這個畫素的大小。(個人理解)

1.均值模糊函式blur():定義:blur(src,ksize,dst=None, anchor=None, borderType=None)

定義是有5個引數,但最後三個均為none,所以也就2個引數

src:要處理的原影象

ksize: 周圍關聯的畫素的範圍:程式碼中(5,5)就是9*5的大小,就是計算這些範圍內的均值來確定中心位置的大小

2.中值模糊函式medianBlur(): 定義:medianBlur(src, ksize, dst=None)

ksize與blur()函式不同,不是矩陣,而是一個數字,例如為5,就表示了5*5的方陣

3.高斯平滑函式GaussianBlur():定義:GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

sigmaX:標準差

高斯濾波沒有考慮影象的邊緣,會將邊緣模糊掉。

4.高斯雙邊濾波函式bilateralFilter():定義:bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
  d:鄰域直徑
  sigmaColor:顏色標準差
  sigmaSpace:空間標準差

通俗理解:當遠離邊界時,即顏色十分相近,顏色權基本一樣時,類似於高斯濾波,這樣變可平滑處理影象。當處在邊界時(所謂邊界,就是顏色反差極大的地方),邊界上的點互相顏色相近,會取極大的權值,而邊界外的的點,顏色距離很遠,權值取的很小(甚重可以忽略不計),這樣就保護了邊緣(保邊去噪)。

5.均值漂移濾波函式pyrMeanShiftFiltering() :定義:pyrMeanShiftFiltering(sr,sp,sr,ds = None,maxLevel = None, termcrit = None )

src:輸入影象,8位,三通道的彩色影象。
  sp:定義的漂移物理空間半徑大小
  sr:定義的漂移色彩空間半徑大小

這個函式讓影象在色彩層面平滑濾波,它可以中和色彩分佈相近的顏色,平滑色彩細節,侵蝕掉面積較小的顏色區域。

6.自定義模糊:使用的函式為:filter2D():定義為filter2D(src,ddepth,kernel)

ddepth:深度,輸入值為-1時,目標影象和原影象深度保持一致

kernel: 卷積核(或者是相關核),一個單通道浮點型矩陣

修改kernel矩陣即可實現不同的模糊

import cv2 as cv
import numpy as np
from numpy.lib.type_check import imag

def mo_image(src1):
    #均值模糊  這裡需要了解卷積核原理  括號裡的數字必須為單數,且數字越大,模糊效果越明顯
    src2 = cv.blur(src1,(5,5))
    cv.imshow('blur',src2)


    # 中值模糊 對椒鹽噪聲有良好的去噪效果
    src2 = cv.medianBlur(src1,5)
    cv.imshow('medianBlur',src2)

    # 高斯模糊
    src2 = cv.GaussianBlur(src1,(5,5),2)
    cv.imshow('GaussianBlur',src2)

    # 雙邊濾波
    src2 = cv.bilateralFilter(src1,5,5,2)
    cv.imshow('bilateralFilter',src2)


# 自定義模糊函式
def zi_image(src1):
    kernel1 = np.ones((5,5),np.float)/25 #自定義矩陣,並防止數值溢位
    src2 = cv.filter2D(src1,-1,kernel1)

    # 自定義模糊
    cv.imshow("custom_mean_blur", src2)
    kernel2 = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)   #數組裡面的數的和為1或0
    src2 = cv.fillter2D(src1,-1,kernel2)

    # 銳化,使影象更清晰
    cv.imshow("custom_sharpening", src2)

def clamp(pv):
    if pv > 255:
        return 255
    if pv < 0:
        return 0
    return pv

# 新增噪聲
def gaussian_noise(image):
    h,w,c = image.shape
    for row in range(h):
        for col in range(w):
        # 從0,10之間取三個數
            s = np.random.normal(0,10,3)
            b = image[row,col,0]
            g = image[row,col,1]
            r = image[row,col,2]
            image[row,col,0] = clamp(b+s[0])
            image[row,col,1] = clamp(g+s[1])
            image[row,col,2] = clamp(r+s[2])
    cv.imshow("noise image",image)


# 邊緣保留濾波(EPF)
# 高斯雙邊濾波
def bilateral_demo(img):
    dst = cv.bilateralFilter(src=img, d=0, sigmaColor=100, sigmaSpace=15)
    '''
    高斯雙邊模糊,相當於磨皮操作
    src:原影象
    d: 畫素的領域直徑,可由sigmaColor和sigmaColor計算得到
    sigmaColor: 顏色空間的標準方差,一般越大越好
    sigmaSpace: 座標空間的標準方差(畫素單位),一般越小越好
    '''
    cv.imshow('bilateal_dome', dst)
    kennel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)  # 銳化操作使影象更立體
    dst1 = cv.filter2D(dst, -1, kennel)  # -1 表示和原圖一樣
    cv.imshow('sharpening_dome', dst1)

# 均值偏移濾波
def mean_shift_demo(img):
    dst = cv.pyrMeanShiftFiltering(src=img, sp=15, sr=20)
    '''
    均值偏移濾波處理,想當與把圖片轉油畫的操作
    src: 原影象
    sp:空間窗的半徑(The spatial window radius)
    sr: 色彩窗的半徑(The color window radius)
    通過均值遷移來進行邊緣保留濾波有時會導致影象過度模糊
    '''
    cv.imshow('mean_shift_demo', dst)

if __name__ == '__main__':
    '''
    模糊函式mo_image()
    '''
    # src = cv.imread("pic/cat.jpg")
    # cv.namedWindow("original", cv.WINDOW_NORMAL)
    # cv.imshow("original", src)
    # mo_image(src)
    # cv.waitKey(0)
    # cv.destroyAllWindows()

    '''
    自定義模糊zi_image()
    '''
    # src = cv.imread("pic/cat.jpg")
    # cv.namedWindow("original", cv.WINDOW_NORMAL)
    # cv.imshow("original", src)
    # zi_image(src)
    # cv.waitKey(0)
    # cv.destroyAllWindows()

    '''
    新增噪聲gaussian_noise()
    '''
    # src = cv.imread("pic/cat.jpg")
    # cv.namedWindow("original", cv.WINDOW_NORMAL)
    # cv.imshow("original", src)
    # gaussian_noise(src)
    # cv.waitKey(0)
    # cv.destroyAllWindows()

    '''
    高斯雙邊濾波bilateral_demo()
    '''
    # src = cv.imread("data/baboon.jpg")
    # cv.namedWindow("original", cv.WINDOW_NORMAL)
    # cv.imshow("original", src)
    # bilateral_demo(src)
    # cv.waitKey(0)
    # cv.destroyAllWindows()


    '''
    均值偏移濾波mean_shift_demo()
    '''
    src = cv.imread("pic/bizhi.jpg")
    cv.namedWindow("original", cv.WINDOW_NORMAL)
    cv.imshow("original", src)
    mean_shift_demo(src)
    cv.waitKey(0)
    cv.destroyAllWindows()

努力拼搏吧,不要害怕,不要去規劃,不要迷茫。但你一定要在路上一直的走下去,儘管可能停滯不前,但也要走。