0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenCV種支持標(biāo)準(zhǔn)卷積邊緣填充做法

OpenCV學(xué)堂 ? 來源:OpenCV學(xué)堂 ? 作者:OpenCV學(xué)堂 ? 2022-07-12 14:18 ? 次閱讀

概述

OpenCV在使用卷積進(jìn)行圖像處理過程種,如何處理邊緣像素錨定輸出兩個(gè)技術(shù)細(xì)節(jié)一直是很多人求而不得的疑惑。其實(shí)OpenCV在做卷積濾波時(shí)會(huì)對(duì)圖像進(jìn)行邊界填充,實(shí)現(xiàn)對(duì)邊緣像素的卷積計(jì)算的支持,不同填充方式不同錨定點(diǎn)會(huì)得到圖像卷積輸出不同的結(jié)果。

邊界填充

我們首先來看一下OpenCV種支持標(biāo)準(zhǔn)卷積邊緣填充做法,OpenCV支持的有如下幾種卷積邊緣填充算法:

常量邊界

BORDER_CONSTANT

iiiiii|abcdefgh|iiiiiii

邊界復(fù)制

BORDER_REPLICATE

aaaaaa|abcdefgh|hhhhhhh

邊界反射

BORDER_REFLECT

fedcba|abcdefgh|hgfedcb

邊界換行

BORDER_WRAP

cdefgh|abcdefgh|abcdefg

邊界反射101

BORDER_REFLECT_101

gfedcb|abcdefgh|gfedcba

邊界透明-很不幸運(yùn)的是OpenCV4已經(jīng)不支持啦!

BORDER_TRANSPARENT

uvwxyz|abcdefgh|ijklmno

默認(rèn)填充方式

OpenCV中 filter2D, blur, GaussianBlur等卷積操作默認(rèn)支持為BORDER_DEFAULT(BORDER_REFLECT_101)

各種不同方式對(duì)邊緣的填充效果如下:

ad3a60fa-01a9-11ed-ba43-dac502259ad0.jpg

上圖背景為紅色,填充上下左右四個(gè)像素大小邊緣!右下角為原圖,左上角圖像為常量邊緣填充效果(i=0黑色)。

相關(guān)代碼實(shí)現(xiàn)如下:

image=cv.imread("D:/images/qxx.png");
ih,iw=image.shape[:2]
border=4

#邊界填充
b1=cv.copyMakeBorder(image,border,border,border,border,cv.BORDER_CONSTANT)
b2=cv.copyMakeBorder(image,border,border,border,border,cv.BORDER_REPLICATE)
b3=cv.copyMakeBorder(image,border,border,border,border,cv.BORDER_REFLECT)
b4=cv.copyMakeBorder(image,border,border,border,border,cv.BORDER_WRAP)
b5=cv.copyMakeBorder(image,border,border,border,border,cv.BORDER_REFLECT_101)

#邊界填充類型說明
cv.putText(image,"input",(20,20),cv.FONT_HERSHEY_PLAIN,1.0,(255,0,0))
cv.putText(b1,"BORDER_CONSTANT",(20,20),cv.FONT_HERSHEY_PLAIN,1.0,(255,0,0))
cv.putText(b2,"BORDER_REPLICATE",(20,20),cv.FONT_HERSHEY_PLAIN,1.0,(255,0,0))
cv.putText(b3,"BORDER_REFLECT",(20,20),cv.FONT_HERSHEY_PLAIN,1.0,(255,0,0))
cv.putText(b4,"BORDER_WRAP",(20,20),cv.FONT_HERSHEY_PLAIN,1.0,(255,0,0))
cv.putText(b5,"BORDER_REFLECT_101",(20,20),cv.FONT_HERSHEY_PLAIN,1.0,(255,0,0))

#拼接結(jié)果輸出
h=b1.shape[0]*2+8
w=b1.shape[1]*3+16
bh,bw=b1.shape[:2]
result=np.zeros([h,w,3],dtype=np.uint8)
result[:,:,:]=(0,0,255)
result[0:bh,0:bw,:]=b1;
result[0:bh,bw+8:bw+bw+8,:]=b2;
result[0:bh,bw+bw+16:bw+bw+bw+16,:]=b3;
result[bh+8:bh+bh+8,0:bw,:]=b4;
result[bh+8:bh+bh+8,bw+8:bw+bw+8,:]=b5;
result[bh+12:bh+12+ih,bw+bw+20:bw+bw+20+iw,:]=image;

#顯示
cv.imshow("result",result)
cv.imwrite("D:/border_result.png",result)
cv.waitKey(0)
cv.destroyAllWindows()

錨定位置

在進(jìn)行卷積處理的時(shí)候,卷積mask與對(duì)應(yīng)的像素塊點(diǎn)乘得到輸出,把輸出結(jié)果賦值給哪個(gè)像素點(diǎn)是由錨定參數(shù)anchor決定,以自定義濾波函數(shù)filter2D為例說明

voidcv::filter2D(
InputArraysrc,
OutputArraydst,
intddepth,
InputArraykernel,
Pointanchor=Point(-1,-1),
doubledelta=0,
intborderType=BORDER_DEFAULT
)
其中
kernel - 表示輸入的自定義卷積核大小
anchor - 表示錨定點(diǎn)位置,默認(rèn)情況Point(-1,-1)表示是卷積核的中心位置
borderType - 表示邊緣填充的像素大小,ksize/2其中ksize表示卷積核大小

上述函數(shù)在卷積核為奇數(shù)的時(shí)候,卷積核的中心位置很容易確定,比如3x3的卷積核大小,中心位置為Point(1,1)5x5的卷積核大小中心位置為Point(2,2)

但是當(dāng)卷積核大小為偶數(shù)的時(shí)候,很多人都搞不清楚中心位置是如何確定的,其實(shí)這個(gè)時(shí)候中心也為(ksize/2), 對(duì)2x2的卷積核,中心位置為Point(1,1)4x4的卷積核中心位置為Point(2,2)。

錨定位置對(duì)卷積結(jié)果的影響

以2x2與4x4的卷積核為與3x3與5x5的像素?cái)?shù)據(jù)為例

情況一

2x2卷積核對(duì)3x3的像素塊

ad5a1eb8-01a9-11ed-ba43-dac502259ad0.png

ad6c6776-01a9-11ed-ba43-dac502259ad0.png

當(dāng)錨定點(diǎn)為默認(rèn)(1,1)/(-1,-1)時(shí)候:

ad7e1552-01a9-11ed-ba43-dac502259ad0.png

當(dāng)錨定點(diǎn)設(shè)置為(0,0)時(shí):

ad91dfe2-01a9-11ed-ba43-dac502259ad0.png

可以看到二者的輸出結(jié)果全然不同,原因在于當(dāng)錨定點(diǎn)不同的時(shí)候,卷積mask的開始位置也會(huì)不不同,圖示如下:

ada20f98-01a9-11ed-ba43-dac502259ad0.jpg

情況二:

4x4卷積核對(duì)5x5的像素塊:

adb38278-01a9-11ed-ba43-dac502259ad0.png

使用BORDER_DEFAULT填充方式,填充之后為:

adc6234c-01a9-11ed-ba43-dac502259ad0.png

不同錨定位置的均值卷積輸出結(jié)果:

ade1a13a-01a9-11ed-ba43-dac502259ad0.jpg

三個(gè)不同錨定點(diǎn)對(duì)應(yīng)卷積mask的起始位置與錨定像素輸出:

adfc7d98-01a9-11ed-ba43-dac502259ad0.jpg

代碼演示如下:

src=np.zeros([3,3],dtype=np.uint8)
src[0,0]=16
src[1,1]=8
src[2,2]=4
print("
inputimage:
",src)

k1=[[1,0],[0,-1]]
print("
kernel:
",k1)
result=cv.copyMakeBorder(src,1,1,1,1,cv.BORDER_DEFAULT)
print("
BORDER_DEFAULT邊界填充:
",result)
dst=cv.filter2D(src,cv.CV_32F,np.asarray(k1),None,anchor=(0,0),borderType=cv.BORDER_DEFAULT)
print("
filter2D:
",dst)
print("
")

src=np.zeros([5,5],dtype=np.uint8)
src[0,0]=32
src[1,1]=16
src[2,2]=8
src[3,3]=4
src[4,4]=2
print("
input:
",src)
k2=np.ones([4,4],dtype=np.int32)
print("
kernel:
",k2)
result=cv.copyMakeBorder(src,3,3,3,3,cv.BORDER_DEFAULT)
print("
邊界填充:
",result)
dst=cv.filter2D(src,cv.CV_32F,np.asarray(k2),None,anchor=(-1,-1),borderType=cv.BORDER_DEFAULT)
print("
filter2DResult:
",dst)

原文標(biāo)題:詳解OpenCV卷積濾波之邊緣處理與錨定輸出

文章出處:【微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:彭靜

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4262

    瀏覽量

    62233
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4697

    瀏覽量

    68093
  • OpenCV
    +關(guān)注

    關(guān)注

    29

    文章

    623

    瀏覽量

    41179

原文標(biāo)題:詳解OpenCV卷積濾波之邊緣處理與錨定輸出

文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    opencv圖像識(shí)別有什么算法

    OpenCV(Open Source Computer Vision Library)是一個(gè)開源的計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫,提供了大量的圖像處理和計(jì)算機(jī)視覺相關(guān)的算法。以下是一些常見的OpenCV
    的頭像 發(fā)表于 07-16 10:40 ?603次閱讀

    opencv-python和opencv一樣嗎

    的。以下是對(duì)OpenCVOpenCV-Python的比較: 編程語言: OpenCV是一個(gè)跨平臺(tái)的庫,支持多種編程語言,如C++、Java、Python等。而
    的頭像 發(fā)表于 07-16 10:38 ?688次閱讀

    opencv的主要功能有哪些

    OpenCV提供了豐富的圖像處理功能,包括圖像的讀取、顯示、保存、轉(zhuǎn)換等。此外,OpenCV支持圖像的濾波、邊緣檢測、形態(tài)學(xué)操作、圖像金字塔等高級(jí)圖像處理技術(shù)。 特征檢測與描述:
    的頭像 發(fā)表于 07-16 10:35 ?1051次閱讀

    圖像處理中的卷積運(yùn)算

    卷積運(yùn)算是圖像處理中一極其重要的操作,廣泛應(yīng)用于圖像濾波、邊緣檢測、特征提取等多個(gè)方面。它基于一個(gè)核(或稱為卷積核、濾波器)與圖像進(jìn)行相乘并求和的過程,通過這一操作可以實(shí)現(xiàn)對(duì)圖像的平
    的頭像 發(fā)表于 07-11 15:15 ?1378次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)示例

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,簡稱CNN)是一深度學(xué)習(xí)模型,主要用于處理具有網(wǎng)格結(jié)構(gòu)的數(shù)據(jù),如圖像。CNN通過卷積層自動(dòng)提取圖像特征,然后通過全連接層進(jìn)行
    的頭像 發(fā)表于 07-03 10:51 ?313次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)原理

    、訓(xùn)練過程以及應(yīng)用場景。 卷積神經(jīng)網(wǎng)絡(luò)的基本原理 1.1 卷積操作 卷積神經(jīng)網(wǎng)絡(luò)的核心是卷積操作。卷積操作是一
    的頭像 發(fā)表于 07-03 10:49 ?453次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練的是什么

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,簡稱CNN)是一深度學(xué)習(xí)模型,廣泛應(yīng)用于圖像識(shí)別、視頻分析、自然語言處理等領(lǐng)域。本文將詳細(xì)介紹卷積神經(jīng)網(wǎng)絡(luò)的基本概念、結(jié)構(gòu)
    的頭像 發(fā)表于 07-03 09:15 ?276次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的原理與實(shí)現(xiàn)

    1.卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,簡稱CNN)是一深度學(xué)習(xí)模型,廣泛應(yīng)用于圖像識(shí)別、視頻分析、自然語言處理等領(lǐng)域。 卷積神經(jīng)網(wǎng)絡(luò)是一前饋
    的頭像 發(fā)表于 07-02 16:47 ?385次閱讀

    請(qǐng)問ESP32是否支持GPIO邊緣觸發(fā)喚醒?

    請(qǐng)問ESP32是否支持GPIO邊緣觸發(fā)喚醒,例如GPIO下降沿觸發(fā)或者上升沿觸發(fā)。
    發(fā)表于 06-18 08:09

    什么是芯片底部填充膠,它有什么特點(diǎn)?

    什么是芯片底部填充膠,它有什么特點(diǎn)?芯片底部填充膠是一用于電子封裝的膠水,主要用于底部填充bga芯片電子組件,以增強(qiáng)組件的可靠性和穩(wěn)定性。它通常是一
    的頭像 發(fā)表于 03-14 14:10 ?881次閱讀
    什么是芯片底部<b class='flag-5'>填充</b>膠,它有什么特點(diǎn)?

    填充膠是做什么用的?

    填充膠是做什么用的?填充膠是一廣泛應(yīng)用于電子制造和其他工業(yè)領(lǐng)域的材料,它在提高產(chǎn)品性能、增強(qiáng)結(jié)構(gòu)穩(wěn)定性以及保護(hù)核心組件方面發(fā)揮著至關(guān)重要的作用。以下是關(guān)于填充膠的主要用途和它在不同應(yīng)
    的頭像 發(fā)表于 01-17 14:52 ?873次閱讀
    <b class='flag-5'>填充</b>膠是做什么用的?

    OpenCV邊緣模板匹配算法原理詳解

    ,悲喜交加,充分感受到了理想與現(xiàn)實(shí)的距離,不過沒關(guān)系,這里介紹一新的模板匹配算法,主要是基于圖像邊緣梯度,它對(duì)圖像光照與像素遷移都有很強(qiáng)的抗干擾能力,據(jù)說Halcon的模板匹配就是基于此的加速版本,在工業(yè)應(yīng)用場景中已經(jīng)得到廣泛使用。
    的頭像 發(fā)表于 12-07 10:56 ?1223次閱讀
    <b class='flag-5'>OpenCV</b><b class='flag-5'>邊緣</b>模板匹配算法原理詳解

    OpenCV4.8 CUDA編程代碼教程

    OpenCV4支持通過GPU實(shí)現(xiàn)CUDA加速執(zhí)行,實(shí)現(xiàn)對(duì)OpenCV圖像處理程序的加速運(yùn)行,當(dāng)前支持加速的模塊包括如下。
    的頭像 發(fā)表于 12-05 09:56 ?913次閱讀
    <b class='flag-5'>OpenCV</b>4.8 CUDA編程代碼教程

    OpenCV4.8+CUDA+擴(kuò)展模塊支持編譯指南

    OpenCV4.8+CUDA+擴(kuò)展模塊支持編譯指南
    的頭像 發(fā)表于 11-30 16:45 ?828次閱讀
    <b class='flag-5'>OpenCV</b>4.8+CUDA+擴(kuò)展模塊<b class='flag-5'>支持</b>編譯指南

    OpenCV對(duì)openEuler提供上游原生支持

    2023年11月17日,OpenCV社區(qū)正式接納openEuler作為持續(xù)集成(Continuous Integration,CI)系統(tǒng)的操作系統(tǒng)之一,對(duì)openEuler提供上游原生支持
    的頭像 發(fā)表于 11-20 09:14 ?748次閱讀