函數說明
OpenCV C++的圖像對象Mat有一個函數convertTo可以把圖像數據在不同的精度類型之間來回切換比如從字節(jié)到浮點數之間來回切換。非常方便,該函數的官方說明如下:其中參數alpha可以讓數據放縮到指定的范圍內,比如從字節(jié)到浮點數類型
浮點數類型到字節(jié)類型CV_8U 轉換為CV_32F
alpha=1.0/255.0時表示從0~255切換到0~1之間
同時該函數還有另外一個功能就是對超過范圍的數據進行最大最小極限取值,低于0的取值0,大于255取值255。 但是到了Python中之后,很多人就會認為convertTo函數只是一個數據精度類型轉換函數,不會太過關心細節(jié),然后直接使用它。這樣的結果往往導致一些細數據差異跟輸出不一致問題出現。CV_32F 轉換為CV_8U
alpha=255時表示從0~1切換到0~255之間
C++/Python對比
對一張輸入圖像完成Sobel濾波操作,C++實現的代碼如下:
Matimage=imread("D:/images/dannis1.png",IMREAD_GRAYSCALE);
imshow("input",image);
Matm1,m2;
image.convertTo(m1,CV_32F,1.0/255.0);
Matgradx;
Sobel(m1,gradx,-1,1,0);
gradx.convertTo(m2,CV_8U,255);
imshow("sobel",m2);
Python對應的代碼如下:
importcv2ascv
importnumpyasnp
image=cv.imread("D:/images/dannis1.png",cv.IMREAD_GRAYSCALE)
cv.imshow("input",image)
m1=np.float32(image)/np.float(255)
gradx=cv.Sobel(m1,-1,1,0);
m2=np.uint8(gradx*255)
cv.imshow("sobel",m2)
cv.waitKey(0)
cv.destroyAllWindows()
以往的經驗處理方式是先對gradx做歸一化然后再顯示
這個時候只需添加一行代碼即可獲得正確結果,把代碼:
m2 = np.uint8(gradx * 255)
替換為:
cv.normalize(gradx, gradx, 0, 1.0, cv.NORM_MINMAX)
m2 = np.uint8(gradx * 255)
但是實際結果與C++并不一致,這個時候正確修改方式如下:
m2 = np.uint8(gradx * 255)
替換為:
m2 = np.uint8(np.clip(gradx * 255, 0, 255))
Python版本結果跟C++保持一致了!這個很多書上跟博文并沒有人提到,所以我寫出來分享一下,這個技術細節(jié)點!
審核編輯:何安
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
函數
+關注
關注
3文章
4245瀏覽量
62019 -
python
+關注
關注
53文章
4754瀏覽量
84121
原文標題:OpenCV-Python中沒有Mat.convertTo函數怎么辦?
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
opencv-python和opencv一樣嗎
不一樣。OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,它提供了大量的圖像和視頻處理功能。OpenCV-Python
STM32MP135如何使用opencv-python或v4l2-ctl打開攝像頭,并保存為圖片?
行。
但是官方的例程中,直接用v4l推送到media上,直接顯示的又是可以的。
請問我該如何使用opencv-python 或v4l2-ctl打開攝像頭,并保存為圖片?
發(fā)表于 05-30 06:16
不屬于python的內置函數
Python是一種高級編程語言,它提供了許多內置函數,可以幫助開發(fā)人員更輕松地處理各種任務。但是,在Python中并非所有的函數都是內置
python中各種函數的用法
Python中有很多種不同類型的函數,它們在解決各種問題和完成不同任務時起著重要的作用。下面我將詳細介紹幾種常用的函數,包括內置函數、自定義函數
python調用math函數的方法
在Python編程中,數學函數是非常重要的工具,我們可以使用它們進行各種數值計算、幾何運算和統(tǒng)計分析等操作。Python的標準庫中內置了很多
python函數返回多個參數
函數是程序設計中的一個重要概念,在很多編程語言中都存在。函數可以接受輸入數據,并且根據輸入數據進行一系列操作,最后可以返回一個或多個結果。Python是一種非常流行的編程語言,也支持
sort函數python用法
sort()函數是Python中的內置函數之一,用于對可迭代對象進行排序。可迭代對象包括列表、元組和字符串等。sort()函數是一個靈活而強
range()函數的用法是什么
range()函數是Python中的內置函數,用于生成一個整數序列,可以用于循環(huán)或創(chuàng)建列表。 range()函數的基本語法是: range(
python中insert函數的用法
Python中的insert()函數用于在列表中的指定位置插入元素。它的基本語法如下: list .insert(index, element) 其中,index表示要插入元素的位置,
python如何定義一個函數
一、Python3 函數 函數是組織好的,可重復使用的,用來實現單一,或相關聯(lián)功能的代碼段。 函數能提高應用的模塊性,和代碼的重復利用率。你已經知道
python定義函數與調用函數的順序
定義函數與調用函數的順序 函數被定義后,本身是不會自動執(zhí)行的,只有在被調用后,函數才會被執(zhí)行,得到相應的結果。但是在 Python
一文詳解python調用函數
函數被定義后,本身是不會自動執(zhí)行的,只有在被調用后,函數才會被執(zhí)行,得到相應的結果。但是在 Python 中我們要注意一個關鍵點,就是Python
發(fā)表于 10-01 10:45
?531次閱讀
評論