python+opencv筆記(2)——邊緣填充


python+opencv之邊緣填充

一、邊緣填充

相信很多喜歡玩電腦的小伙伴,遇到過這種情況:有時候換電腦壁紙的時候,原本一張很好看完整的圖片,換成電腦壁紙就是一個不完整或者由很多重復的圖片組成的壁紙。其實這里就有填充的出現。

邊緣填充:因為對於圖像的卷積操作,最邊緣的像素一般無法處理,所以卷積核中心到不了最邊緣像素。這就需要先將圖像的邊界填充,再根據不同的填充算法進行卷積操作,得到的新圖像就是填充后的圖像。

二、邊緣填充函數原型

函數原型:cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value)

src:需要填充的圖像

top:圖像上面填充邊界的長度

bottom:圖像上下面填充邊界的長度

left:圖像左面填充邊界的長度

right :圖像右面填充邊界的長度

borderType:邊界的類型

BORDER_REPLICATE:復制法,即復制最邊緣的像素。例如:aaaa|abcdefg|ggggg

BORDER_REFLECT:反射法,即以最邊緣的像素為對稱軸。例如:fedcba|abcdefg|gfedec

BORDER_REFLECT_101:反射法,也是最邊緣的像素為對稱軸,但與BORDER_REFLECT有區別。例如:fedcb|abcdefg|fedec

BORDER_WRAP:外包裝法,即以圖像的左邊界與右邊界相連,上下邊界相連。例如:cdefgh|abcdefgh|abcdefg

BORDER_CONSTANT:常量法。

如果這里還有不明白的地方,我們可以跟着下面的代碼和效果圖對比,理解每個方法的作用。

value:填充的邊界顏色,通常用於常量法填充中。

三、實現代碼及解釋

1、讀取圖像及顯示圖像代碼

 1 #所需要的庫
 2 import cv2 as cv
 3 import matplotlib.pyplot as plt
 4 import numpy as np
 5 
 6 #讀取圖片cv2.imread("圖片路徑")
 7 img=cv.imread('lufei.jpg')
 8 
 9 #顯示圖像函數
10 def cv_show(name,img):
11     cv.imshow(name,img)
12     cv.waitKey(0)
13     cv.destroyAllWindows()

關於圖像的讀取、顯示等基本操作,具體查看老貓上一篇博客。

2、核心代碼

 1 #各個邊界需要填充的值
 2 top_size,bottom_size,left_size,right_size=(50,50,50,50)
 3 #復制法
 4 replicate=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REPLICATE)
 5 #反射法
 6 reflect=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv.BORDER_REFLECT)
 7 reflect101=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv.BORDER_REFLECT_101)
 8 #外包裝法
 9 wrap=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv.BORDER_WRAP)
10 #常量法,常數值填充
11 constant=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv.BORDER_CONSTANT,value=(0,255,0))
 1 img1=img.copy()
 2 #在各個圖像上添加相應的文本
 3 cv.putText(img1,"original",(0,50),cv.FONT_HERSHEY_COMPLEX,2,(0,250,0),4,8)
 4 cv.putText(replicate,"replicate",(0,50),cv.FONT_HERSHEY_COMPLEX,2,(0,250,0),4,8)
 5 cv.putText(reflect,"reflect",(0,50),cv.FONT_HERSHEY_COMPLEX,2,(0,250,0),4,8)
 6 cv.putText(reflect101,"reflect101",(0,50),cv.FONT_HERSHEY_COMPLEX,2,(0,250,0),4,8)
 7 cv.putText(wrap,"wrap",(0,50),cv.FONT_HERSHEY_COMPLEX,2,(0,250,0),4,8)
 8 cv.putText(constant,"constant",(0,50),cv.FONT_HERSHEY_COMPLEX,2,(0,250,0),4,8)
 9 
10 #顯示圖像
11 cv_show("original",img1)
12 cv_show("replicate",replicate)
13 cv_show("reflect",reflect)
14 cv_show("reflect101",reflect101)
15 cv_show("wrap",wrap)
16 cv_show("constant",constant)

3、效果圖對比

為了對比填充前后的圖像,博主這里上傳的截圖,沒有進行等比縮放,全是原始大小。

根據效果圖可以很明顯的看出,原圖和填充后的圖的大小是不一樣的。

4、細節經驗分享

 (1)老貓在編寫關於圖像邊緣填充的代碼過程中,是使用每一個窗口對應一個圖像的方法顯示圖像,這樣編寫的代碼,就無法很快地直接對比出各個圖像之間的區別。

為了能快速對比出各個方法得出的圖像的區別,可以使用np.vstack()或者np.hstack()對比,將圖像放在同一個窗口。

1 rec=np.hstack((replicate,reflect))
2 cv_show("replicate_reflect",rec)

 

 注意:

問題A:使用np.vstack()或者np.hstack()函數時,圖像的大小必須一致,不然會報錯。

解決A:若不知道兩張圖像的大小,可以使用shape來查看。

例如:

 

問題B.使用np.vstack()或者np.hstack()函數時,可能會出現圖像顯示不完全情況。

解決B:這是因為窗口的大小是根據屏幕的大小來定的,若窗口的長度或者高度超過電腦屏幕的大小,這會以電腦的長度或者高度來顯示。

例如:

 

(2)可以用畫布顯示所有圖像進行對比

代碼:

1 plt.subplot(231),plt.imshow(img,"gray"),plt.title("original")
2 plt.subplot(232),plt.imshow(replicate,"gray"),plt.title("replicate")
3 plt.subplot(233),plt.imshow(reflect,"gray"),plt.title("reflect")
4 plt.subplot(234),plt.imshow(reflect101,"gray"),plt.title("reflect101")
5 plt.subplot(235),plt.imshow(wrap,"gray"),plt.title("wrap")
6 plt.subplot(236),plt.imshow(constant,"gray"),plt.title("constant")
7 plt.show()

 

 效果圖:

 

 


免責聲明!

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



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