(十一) 模糊
模糊操作方式:
均值模糊:一般用來處理圖像的隨機(jī)噪聲
中值模糊:一般用來處理圖像的椒鹽噪聲
自定義模糊:對(duì)圖像進(jìn)行銳化之類的操作
基于離散卷積砾医、定義好每個(gè)卷積核衣厘、不同卷積核得到不同的卷積效果、模糊是卷積的一種表象
import cv2 as cv
import numpy as np
def blur(image):
"""
均值模糊
"""
# 參數(shù)(5影暴,5):表示高斯矩陣的長(zhǎng)與寬都是5
dst = cv.blur(image, (5, 5))
# 圖二為均值模糊圖
cv.imshow("blur", dst)
def median(image):
"""
中值模糊
"""
# 第二個(gè)參數(shù)是孔徑的尺寸,一個(gè)大于1的奇數(shù)撬呢。
# 比如這里是5,中值濾波器就會(huì)使用5×5的范圍來計(jì)算魂拦。
# 即對(duì)像素的中心值及其5×5鄰域組成了一個(gè)數(shù)值集搁嗓,對(duì)其進(jìn)行處理計(jì)算芯勘,當(dāng)前像素被其中值替換掉腺逛。
# 參考自:http://blog.csdn.net/sunny2038/article/details/9155893
dst = cv.medianBlur(image, 5)
# 圖三為中值模糊
cv.imshow("median", dst)
def custom(image):
"""
自定義模糊
"""
# 定義一個(gè)5*5的卷積核
kernel = np.ones([5, 5], np.float32) / 25
dst = cv.filter2D(image, -1, kernel=kernel)
# 圖四為效果圖
cv.imshow("custom", dst)
# 讀入圖片文件
src = cv.imread('images/test.jpg')
# 圖一為原圖
cv.imshow('image 1', src)
blur(src)
median(src)
custom(src)
# 等待用戶操作
cv.waitKey(0)
# 釋放所有窗口
cv.destroyAllWindows()
(十二)高斯模糊
把要模糊的像素色值統(tǒng)計(jì),用數(shù)學(xué)上加權(quán)平均的計(jì)算方法(高斯函數(shù))得到色值安疗,對(duì)范圍茄靠、半徑等進(jìn)行模糊茂契。
一些美顏軟件慨绳、美顏相機(jī)上的磨皮和毛玻璃特效基本上都是用的高斯模糊,并且大部分圖像處理軟件中都有高斯模糊的操作脐雪,除此之外,高斯模糊還具有減少圖像層次和深度的功能璧亚。
import cv2 as cv
import numpy as np
def clamp(pv):
"""防止顏色值超出顏色取值范圍(0-255)"""
if pv > 255:
return 255
if pv < 0:
return 0
else:
return pv
#高斯噪聲
def gaussian_noise(image):
"""高斯噪聲"""
h, w, c = image.shape
for row in range(h):
for col in range(w):
# 獲取三個(gè)高斯隨機(jī)數(shù)
# 第一個(gè)參數(shù):概率分布的均值脂信,對(duì)應(yīng)著整個(gè)分布的中心
# 第二個(gè)參數(shù):概率分布的標(biāo)準(zhǔn)差癣蟋,對(duì)應(yīng)于分布的寬度
# 第三個(gè)參數(shù):生成高斯隨機(jī)數(shù)數(shù)量
s = np.random.normal(0, 20, 3)
# 獲取每個(gè)像素點(diǎn)的bgr值
b = image[row, col, 0]
g = image[row, col, 1]
r = image[row, col, 2]
# 給每個(gè)像素值設(shè)置新的bgr值
image[row, col, 0] = clamp(b + s[0])
image[row, col, 0] = clamp(g + s[1])
image[row, col, 0] = clamp(r + s[2])
cv.imshow("noise", image)
# 讀入圖片文件
src = cv.imread('images/test.jpg')
#高斯噪聲
gaussian_noise(src)
# 給圖片創(chuàng)建毛玻璃特效
# 第二個(gè)參數(shù):高斯核的寬和高(建議是奇數(shù))
# 第三個(gè)參數(shù):x和y軸的標(biāo)準(zhǔn)差
dst = cv.GaussianBlur(src, (5, 5), 15)
cv.imshow("gaussian", dst)
# 等待用戶操作
cv.waitKey(0)
# 釋放所有窗口
cv.destroyAllWindows()
(十三)EPF
高斯模糊只考慮了權(quán)重疯搅,只考慮了像素空間的分布濒生,沒有考慮像素值和另一個(gè)像素值之間差異的問題幔欧,如果像素間差異較大的情況下(比如圖像的邊緣),高斯模糊會(huì)進(jìn)行處理礁蔗,但是我們不需要處理邊緣,要進(jìn)行的操作就叫做邊緣保留濾波(EPF)晒骇。
import cv2 as cv
import numpy as np
def bi(image):
"""
色彩窗的半徑
圖像將呈現(xiàn)類似于磨皮的效果
"""
# image:輸入圖像,可以是Mat類型厉碟,
# 圖像必須是8位或浮點(diǎn)型單通道屠缭、三通道的圖像
# 0:表示在過濾過程中每個(gè)像素鄰域的直徑范圍,一般為0
# 后面兩個(gè)數(shù)字:空間高斯函數(shù)標(biāo)準(zhǔn)差呵曹,灰度值相似性標(biāo)準(zhǔn)差
dst = cv.bilateralFilter(image, 0, 60, 10);
cv.imshow('bi', dst)
def shift(image):
"""
均值遷移
圖像會(huì)呈現(xiàn)油畫效果
"""
# 10:空間窗的半徑
# 50:色彩窗的半徑
dst = cv.pyrMeanShiftFiltering(image, 10, 50);
cv.imshow('shift', dst)
src = cv.imread('images/test.jpg')
# 圖一(原圖)
cv.imshow('def', src)
# 圖二(色彩窗的半徑)
bi(src)
# 圖三(均值遷移)
shift(src)
cv.waitKey(0)
cv.destroyAllWindows()
(十三)圖像直方圖
由于其計(jì)算代價(jià)較小何暮,且具有圖像平移、旋轉(zhuǎn)海洼、縮放不變性等眾多優(yōu)點(diǎn),廣泛地應(yīng)用于圖像處理的各個(gè)領(lǐng)域域帐,特別是灰度圖像的閾值分割、基于顏色的圖像檢索以及圖像分類肖揣。
圖像主題內(nèi)容與背景分離浮入、圖像分類龙优、檢索等事秀。
注意:編寫代碼前需確保 matplotlib 庫(kù)已安裝野舶,如未安裝在命令行中輸入:pip install matplotlib
- 直方圖
import cv2 as cv
from matplotlib import pyplot as plt
def plot(image):
"""簡(jiǎn)單的圖像直方圖"""
plt.hist(image.ravel(), 256, [0, 256])
plt.show("直方圖")
def image_his(image):
"""
這里生成的直方圖是opencv 對(duì)圖片
進(jìn)行分割宰衙、圖像檢索等所需要的
"""
color = ('blue', 'green', 'red')
for i, color in enumerate(color):
hist = cv.calcHist([image], [i], None, [256], [0, 256])
plt.plot(hist, color=color)
plt.xlim([0, 256])
plt.show()
# 讀入圖片文件
src = cv.imread('images/test.jpg')
cv.imshow('def', src)
# 圖一
plot(src)
# 圖二
image_his(src)
cv.waitKey(0)
cv.destroyAllWindows()
- 使用直方圖調(diào)節(jié)對(duì)比度
import cv2 as cv
def equalHist(image):
"""直方圖均衡化,圖像增強(qiáng)的一個(gè)方法"""
# 彩色圖片轉(zhuǎn)換為灰度圖片
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 直方圖均衡化巢掺,自動(dòng)調(diào)整圖像的對(duì)比度,讓圖像變得清晰
dst = cv.equalizeHist(gray)
cv.imshow("equalHist", dst)
def clahe(image):
"""
局部直方圖均衡化
把整個(gè)圖像分成許多小塊(比如按8*8作為一個(gè)小塊)陆淀,
那么對(duì)每個(gè)小塊進(jìn)行均衡化先嬉。
這種方法主要對(duì)于圖像直方圖不是那么單一的(比如存在多峰情況)圖像比較實(shí)用
"""
# 彩色圖片轉(zhuǎn)換為灰度圖片
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# cliplimit:灰度值
# tilegridsize:圖像切割成塊,每塊的大小
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
dst = clahe.apply(gray)
cv.imshow("clahe", dst)
src = cv.imread('images/test.jpg')
# 圖一
cv.imshow("yt", src)
# 圖二
equalHist(src)
# 圖三
clahe(src)
cv.waitKey(0)
cv.destroyAllWindows()
注意:1疫蔓、全圖的直方圖均衡化會(huì)導(dǎo)致對(duì)比度過度增強(qiáng),所以在一些情況下應(yīng)使用局部直方圖均衡化岔乔;
2、opencv中直方圖均衡化都是基于灰度圖像的
- 對(duì)比圖片相似度
import cv2 as cv
import numpy as np
def create_rgb_hist(image):
"""創(chuàng)建rgb 三通道直方圖"""
h, w, c = image.shape
rgbHist = np.zeros([16 * 16 * 16, 1], np.float32)
bsize = 256 / 16
for row in range(h):
for col in range(w):
b = image[row, col, 0]
g = image[row, col, 1]
r = image[row, col, 2]
index = np.int(b / bsize) * 16 * 16 + np.int(g / bsize) * 16 + np.int(r / bsize)
rgbHist[np.int(index), 0] = rgbHist[np.int(index), 0] + 1
return rgbHist
def hist_compare(image1, image2):
hist1 = create_rgb_hist(image1)
hist2 = create_rgb_hist(image2)
# 巴氏距離比較雏门,距離越小越相似
match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)
# 相關(guān)性比較掸掏,相關(guān)性越大越相似
match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)
# 卡方比較,越大越不相似
match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)
print("巴氏距離:%s 相關(guān)性:%s 卡方:%s" % (match1, match2, match3))
hist_compare(cv.imread('images/test.jpg'), cv.imread('images/test.jpg'))