??寫在前面??
??個(gè)人主頁(yè):https://blog.csdn.net/m0_52051577?type=blog?
??歡迎各位大佬支持點(diǎn)贊收藏,三連必回??!
??本人新開(kāi)系列專欄—python圖像處理
?愿每一個(gè)驟雨初晴之時(shí),所有的蜻蜓振翅和雨后驚雷,都?xì)w你。
前言
????????首先引入以下灰度變換的概念。
????????灰度變換是指根據(jù)某種目標(biāo)條件按一定變換關(guān)系逐點(diǎn)改變?cè)磮D像中每一個(gè)像素灰度值的方法。目的是?為了改善畫質(zhì),使圖像的顯示效果更加清晰。?圖像的灰度變換處理是圖像增強(qiáng)處理技術(shù)中的一種非?;A(chǔ)、直接的空間域圖像處理方法,也是圖像數(shù)字化軟件和圖像顯示軟件的一個(gè)重要組成部分?!獊?lái)自百度百科
? ? ? ? 這里采用opencv中的二值化相關(guān)方法進(jìn)行灰度處理,進(jìn)行灰度變換的非線性變換。
目錄
一、所需函數(shù)
二、圖像基本知識(shí)
1、自定義圖像
?2、三種常見(jiàn)圖像相互轉(zhuǎn)換
3、通道分離與合并?
三、圖像運(yùn)算
?四、實(shí)例
?注:本文涉及到的圖片資源可在博客積分資源中獲取,相關(guān)鏈接:https://download.csdn.net/download/m0_52051577/87844285?spm=1001.2014.3001.5503
一、所需函數(shù)
## 1. 圖像讀取
img = cv.imread()
## 2. 彩色圖轉(zhuǎn)灰度圖
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
## 3. 二值化圖像(灰度圖轉(zhuǎn)二值圖)
_, img_bin = cv.threshold(img_gray, th1, th2, cv.THRESH_BINARY)
## 4. 保存圖像
cv.imwrite('pic/bear_gray.jpg', img_gray)
## 5. 通道分離
b, g, r = cv.split(img)
## 6. 通道合并
img_new = cv.merge([b, g, r])
## 7. 兩圖像相加、相減、相乘、相除
img = cv.add(img1, img2)
img = cv.subtract(img1, img2)
img = cv.multiply(img1, img2)
img = cv.divide(img1, img2)
二、圖像基本知識(shí)
1、自定義圖像
b = np.array([
[0, 127, 255],
[255, 0, 255],
[10, 50, 100]
], dtype=np.uint8)
g = b.T
r = b - g
# show(b)
show(cv.merge([b, g, r]))
# cv.imwrite()
?
注:其中,b矩陣中的三個(gè)行向量分別表示純色圖像,其中0表示純黑,255表示純白。g表示b的轉(zhuǎn)置矩陣,r則是將b與g矩陣對(duì)應(yīng)元素相減,最后再用merge函數(shù)將b,g,r三個(gè)單通道的純色圖像合并成一張真彩色三通道圖像。?
RGB顏色對(duì)照表鏈接:RGB顏色對(duì)照表
?2、三種常見(jiàn)圖像相互轉(zhuǎn)換
首先預(yù)先定義函數(shù)。 若圖片的維度為2,即灰度圖,則讀取并展示圖片;若不為灰度圖,即彩色圖,則采用cvtColor()函數(shù)進(jìn)行色彩空間的轉(zhuǎn)換。
def show(img):
if img.ndim == 2:
plt.imshow(img, cmap='gray')
else:
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
plt.show()
# 讀取彩色圖
img = cv.imread('pic/bear500x333.jpg')
# print(img)
show(img)
?
# 讀取灰度圖
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
show(img_gray)
?
如圖,已經(jīng)將彩色圖進(jìn)行灰度處理。?
# 二值化圖像
_, img_bin = cv.threshold(img_gray, 150, 255, cv.THRESH_BINARY)
show(img_bin)
?如圖,將灰度圖二值化處理,其中設(shè)定的值為150和255。該函數(shù)根據(jù)原圖像的像素點(diǎn)分布占比對(duì)圖像根據(jù)設(shè)定的值進(jìn)行二值化。
# 保存圖像
cv.imwrite('pic/apple_gray.jpg', img_gray)
cv.imwrite('pic/apple_bin.jpg', img_bin)
3、通道分離與合并?
?該部分涉及到cv庫(kù)中的split()函數(shù),該函數(shù)用于將多通道圖像分離成單通道圖像,即將三通道的彩色圖分離成三個(gè)單通道的純色圖。
# 分離BGR通道
# r = img[:,:,0]
b, g, r = cv.split(img)
# b.shape
#show(b)
#show(g)
show(r)
?
如圖,從左到右依次為b,g,r對(duì)應(yīng)的單通道圖像。倘若我們將b,g,r重新合并,則可將圖像還原為原彩色圖。
# 合并BGR通道
img_new = cv.merge([b, g, r])
show(img_new)
?
?此外,還可將原彩色圖中的r,g,b三個(gè)色彩通道按自定義的權(quán)重進(jìn)行重新調(diào)整,將其轉(zhuǎn)化為灰度圖。如下所示:
# rgb轉(zhuǎn)灰度圖
img_gray2 = 0.114*b + 0.587*g + 0.299*r
# img_gray2 = (0.299*r + 0.587*g + 0.114*b).astype(np.uint8)
show(img_gray2)
?
三、圖像運(yùn)算
該部分主要涉及圖像的加減乘除處理。?
bg = cv.imread('D:\\proclass\\class\\pic\\background.jpg', 0)
ob = cv.imread('D:\\proclass\\class\\pic\\computer500x500.jpg', 0)
show(np.hstack([bg, ob]))
?
注:將兩個(gè)圖像用hstack()函數(shù)實(shí)現(xiàn)水平方向的拼接,但要求兩個(gè)圖像的維度必須一致。?具體可用shape()函數(shù)對(duì)圖像的維度進(jìn)行檢查。
# 圖像相加
# img_add = cv.add(bg*0.5, ob*0.5)
img_add = bg * 0.5 + ob * 0.5
show(img_add)
將兩張圖片按定義的權(quán)重進(jìn)行相加處理,也可采用cv中的add()函數(shù)。 相加主要用于混合圖像和添加噪聲。
# 圖像相減
# img_sub = img_add - bg * 0.5
img_sub = cv.subtract(img_add, bg * 0.5)
show(img_sub)
?
同理,對(duì)兩張圖像進(jìn)行相減操作。 用來(lái)消除背景或者比較差異。
# 圖像相乘
mask = cv.imread('D:\\proclass\\class\\pic\\mask500x500.jpg', 0)
# mask /= 255
# show(mask)
show(np.hstack([ob, mask]))
img_mul = cv.multiply(ob/1.0, mask/255)
show(img_mul)
?
?進(jìn)行相乘處理,用來(lái)遮擋圖像。
# 圖像相除
ob_noise = cv.imread('D:\\proclass\\class\\pic\\hedgehog_noise_500x500.jpg', 0)
show(np.hstack([ob, ob_noise]))
img_div = cv.divide(ob, ob_noise+1)
show(img_div)
?
?其中,ob_noise為帶噪聲的圖像,用來(lái)比較兩張圖中的差異。
?四、實(shí)例
第一步,讀入圖片。
bg = cv.imread('pic/petal500x500.jpg')
ob = cv.imread('pic/hedgehog500x500.jpg')
mask = cv.imread('pic/mask500x500.jpg')
show(np.hstack([bg, ob, mask]))
??
?第二步,用mask對(duì)第二張圖片進(jìn)行遮擋。
ob_select = np.float32(ob/1.0) * np.float32(mask/255.0)
show(np.uint8(ob_select))
?
?第三步,將mask圖像的周圍區(qū)域進(jìn)行邊緣處理,并用第一張圖像對(duì)黑洞周圍的區(qū)域進(jìn)行填充。
bg_select = np.float32(bg/1.0) * np.float32(1-mask/255.0)
show(np.uint8(bg_select))
?
?第四步,將第二步處理后的圖像與第三步處理后的圖像按指定權(quán)重相加。從而實(shí)現(xiàn)圖像的混合。
nice = cv.add(ob_select*0.8, bg_select).astype(np.uint8)
show(nice)
?
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-465290.html文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-465290.html
?
到了這里,關(guān)于python圖像處理實(shí)戰(zhàn)(二)—二值化圖像與線性變換的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!