在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OpenCV種支持標準卷積邊緣填充做法

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

概述

OpenCV在使用卷積進行圖像處理過程種,如何處理邊緣像素錨定輸出兩個技術細節一直是很多人求而不得的疑惑。其實OpenCV在做卷積濾波時會對圖像進行邊界填充,實現對邊緣像素的卷積計算的支持,不同填充方式不同錨定點會得到圖像卷積輸出不同的結果。

邊界填充

我們首先來看一下OpenCV種支持標準卷積邊緣填充做法,OpenCV支持的有如下幾種卷積邊緣填充算法:

常量邊界

BORDER_CONSTANT

iiiiii|abcdefgh|iiiiiii

邊界復制

BORDER_REPLICATE

aaaaaa|abcdefgh|hhhhhhh

邊界反射

BORDER_REFLECT

fedcba|abcdefgh|hgfedcb

邊界換行

BORDER_WRAP

cdefgh|abcdefgh|abcdefg

邊界反射101

BORDER_REFLECT_101

gfedcb|abcdefgh|gfedcba

邊界透明-很不幸運的是OpenCV4已經不支持啦!

BORDER_TRANSPARENT

uvwxyz|abcdefgh|ijklmno

默認填充方式

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

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

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

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

相關代碼實現如下:

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))

#拼接結果輸出
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()

錨定位置

在進行卷積處理的時候,卷積mask與對應的像素塊點乘得到輸出,把輸出結果賦值給哪個像素點是由錨定參數anchor決定,以自定義濾波函數filter2D為例說明

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

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

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

錨定位置對卷積結果的影響

以2x2與4x4的卷積核為與3x3與5x5的像素數據為例

情況一

2x2卷積核對3x3的像素塊

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

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

當錨定點為默認(1,1)/(-1,-1)時候:

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

當錨定點設置為(0,0)時:

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

可以看到二者的輸出結果全然不同,原因在于當錨定點不同的時候,卷積mask的開始位置也會不不同,圖示如下:

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

情況二:

4x4卷積核對5x5的像素塊:

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

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

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

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

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

三個不同錨定點對應卷積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)

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

文章出處:【微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭靜

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62979
  • 代碼
    +關注

    關注

    30

    文章

    4828

    瀏覽量

    69063
  • OpenCV
    +關注

    關注

    31

    文章

    635

    瀏覽量

    41563

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

文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    先進封裝Underfill工藝中的四常用的填充膠CUF,NUF,WLUF和MUF介紹

    今天我們再詳細看看Underfill工藝中所用到的四填充膠:CUF,NUF,WLUF和MUF。 倒裝芯片的底部填充工藝一般分為三:毛細填充
    的頭像 發表于 01-28 15:41 ?159次閱讀
    先進封裝Underfill工藝中的四<b class='flag-5'>種</b>常用的<b class='flag-5'>填充</b>膠CUF,NUF,WLUF和MUF介紹

    芯片底部填充膠種類有哪些?

    組成和應用特點進行分類,底部填充膠可以分為以下幾種類型:一、按填充方式分類完全底部填充法:將底部空隙完全填滿,提供最大的保護和支撐。邊緣底部填充
    的頭像 發表于 12-27 09:16 ?412次閱讀
    芯片底部<b class='flag-5'>填充</b>膠種類有哪些?

    AI模型部署邊緣設備的奇妙之旅:目標檢測模型

    填充(Padding): 填充(Padding)是在卷積神經網絡(CNN)中為輸入張量的邊緣添加額外的像素,以控制輸出特征圖的大小并保持輸入圖像的空間尺寸。
    發表于 12-19 14:33

    AI模型部署邊緣設備的奇妙之旅:如何在邊緣端部署OpenCV

    邊緣,通常與邊緣檢測相關聯。 文件保存 cv2.imwrite() 將圖像保存到磁盤。 目的:保存處理后的圖像以便將來使用或分享。 此外,還有其他重要的OpenCV功能,如: 直方圖均衡
    發表于 12-14 09:31

    opencv圖像識別有什么算法

    OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,提供了大量的圖像處理和計算機視覺相關的算法。以下是一些常見的OpenCV
    的頭像 發表于 07-16 10:40 ?1212次閱讀

    opencv-python和opencv一樣嗎

    的。以下是對OpenCVOpenCV-Python的比較: 編程語言: OpenCV是一個跨平臺的庫,支持多種編程語言,如C++、Java、Python等。而
    的頭像 發表于 07-16 10:38 ?1405次閱讀

    opencv的主要功能有哪些

    OpenCV提供了豐富的圖像處理功能,包括圖像的讀取、顯示、保存、轉換等。此外,OpenCV支持圖像的濾波、邊緣檢測、形態學操作、圖像金字塔等高級圖像處理技術。 特征檢測與描述:
    的頭像 發表于 07-16 10:35 ?1766次閱讀

    圖像處理中的卷積運算

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

    卷積神經網絡實現示例

    卷積神經網絡(Convolutional Neural Network,簡稱CNN)是一深度學習模型,主要用于處理具有網格結構的數據,如圖像。CNN通過卷積層自動提取圖像特征,然后通過全連接層進行
    的頭像 發表于 07-03 10:51 ?517次閱讀

    卷積神經網絡的實現原理

    、訓練過程以及應用場景。 卷積神經網絡的基本原理 1.1 卷積操作 卷積神經網絡的核心是卷積操作。卷積操作是一
    的頭像 發表于 07-03 10:49 ?658次閱讀

    卷積神經網絡訓練的是什么

    卷積神經網絡(Convolutional Neural Networks,簡稱CNN)是一深度學習模型,廣泛應用于圖像識別、視頻分析、自然語言處理等領域。本文將詳細介紹卷積神經網絡的基本概念、結構
    的頭像 發表于 07-03 09:15 ?521次閱讀

    卷積神經網絡的原理與實現

    1.卷積神經網絡(Convolutional Neural Networks,簡稱CNN)是一深度學習模型,廣泛應用于圖像識別、視頻分析、自然語言處理等領域。 卷積神經網絡是一前饋
    的頭像 發表于 07-02 16:47 ?728次閱讀

    請問ESP32是否支持GPIO邊緣觸發喚醒?

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

    verilog實現卷積運算

    在Verilog中實現卷積運算,你可以使用以下示例代碼。這里假設輸入數據是有符號8位數,輸出數據也是有符號8位數。卷積在數字信號處理中通常指的是兩個序列的逐元素乘積的和,也就是點乘。 module
    發表于 03-26 07:51

    什么是芯片底部填充膠,它有什么特點?

    什么是芯片底部填充膠,它有什么特點?芯片底部填充膠是一用于電子封裝的膠水,主要用于底部填充bga芯片電子組件,以增強組件的可靠性和穩定性。它通常是一
    的頭像 發表于 03-14 14:10 ?1154次閱讀
    什么是芯片底部<b class='flag-5'>填充</b>膠,它有什么特點?
    主站蜘蛛池模板: 色秀视频免费高清网站 | 欧美性free免费 | 亚洲欧美日韩国产一区二区三区精品 | 免费在线观看一级毛片 | 啪啪亚洲 | 国产毛片一区二区三区精品 | 亚洲欧美日韩国产一区二区三区精品 | 国产成人a | 操操操插插插 | 成年女人色费视频免费 | 久久影视免费观看网址 | 四虎网址 | 深爱五月激情网 | 天天摸天天添人人澡 | 欧美69xx性欧美 | 成 黄 色 激 情视频网站 | 色91在线 | 免费观看一级成人毛片 | 俺去啦在线视频 | 天天干天天操天天爽 | 老师叫我下面含着精子去上课 | 伊人三级 | 亚洲狠狠网站色噜噜 | 久久久精品午夜免费不卡 | 免费人成在线观看网站 | 黄色网址 在线播放 | 国产综合成色在线视频 | 国内精品伊人久久大香线焦 | 亚洲91在线视频 | 国产一二三区精品 | 四虎影院观看视频在线观看 | 一区二区影院 | 97色伦人人 | 一本大道高清在线视频 视频 | 国产亚洲papapa | 狠狠色丁香婷婷第六色孕妇 | 激情六月婷婷 | sss在线play | 日韩精品一区二区在线观看 | 女人张开腿 让男人桶个爽 免费观看 | 精品乱人伦一区二区三区 |