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

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

3天內不再提示

OpenCV-Python中的函數說明

OpenCV學堂 ? 來源:OpenCV學堂 ? 作者:gloomyfish ? 2022-07-08 10:52 ? 次閱讀

函數說明

OpenCV C++的圖像對象Mat有一個函數convertTo可以把圖像數據在不同的精度類型之間來回切換比如從字節(jié)到浮點數之間來回切換。非常方便,該函數的官方說明如下:

80e2c9c2-fc70-11ec-ba43-dac502259ad0.png

其中參數alpha可以讓數據放縮到指定的范圍內,比如從字節(jié)到浮點數類型
CV_8U 轉換為CV_32Falpha=1.0/255.0時表示從0~255切換到0~1之間
浮點數類型到字節(jié)類型
CV_32F 轉換為CV_8Ualpha=255時表示從0~1切換到0~255之間
同時該函數還有另外一個功能就是對超過范圍的數據進行最大最小極限取值,低于0的取值0,大于255取值255。 但是到了Python中之后,很多人就會認為convertTo函數只是一個數據精度類型轉換函數,不會太過關心細節(jié),然后直接使用它。這樣的結果往往導致一些細數據差異跟輸出不一致問題出現。

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學堂】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    opencv-pythonopencv一樣嗎

    不一樣。OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,它提供了大量的圖像和視頻處理功能。OpenCV-Python
    的頭像 發(fā)表于 07-16 10:38 ?498次閱讀

    STM32MP135如何使用opencv-python或v4l2-ctl打開攝像頭,并保存為圖片?

    行。 但是官方的例程,直接用v4l推送到media上,直接顯示的又是可以的。 請問我該如何使用opencv-python 或v4l2-ctl打開攝像頭,并保存為圖片?
    發(fā)表于 05-30 06:16

    pythonopen函數的用法詳解

    pythonopen函數的用法詳解 Python的open()函數用于打開文件。它接受文件名
    的頭像 發(fā)表于 01-30 15:31 ?1591次閱讀

    itop-RK3588開發(fā)板機器視覺開發(fā)OpenCV-Python的安裝

    itop-RK3588開發(fā)板機器視覺開發(fā)OpenCV-Python的安裝
    的頭像 發(fā)表于 01-26 15:18 ?3407次閱讀
    itop-RK3588開發(fā)板機器視覺開發(fā)<b class='flag-5'>OpenCV-Python</b>的安裝

    不屬于python的內置函數

    Python是一種高級編程語言,它提供了許多內置函數,可以幫助開發(fā)人員更輕松地處理各種任務。但是,在Python并非所有的函數都是內置
    的頭像 發(fā)表于 11-29 14:27 ?1186次閱讀

    python各種函數的用法

    Python中有很多種不同類型的函數,它們在解決各種問題和完成不同任務時起著重要的作用。下面我將詳細介紹幾種常用的函數,包括內置函數、自定義函數
    的頭像 發(fā)表于 11-23 15:48 ?640次閱讀

    python調用math函數的方法

    Python編程,數學函數是非常重要的工具,我們可以使用它們進行各種數值計算、幾何運算和統(tǒng)計分析等操作。Python的標準庫內置了很多
    的頭像 發(fā)表于 11-22 11:01 ?2196次閱讀

    python函數返回多個參數

    函數是程序設計的一個重要概念,在很多編程語言中都存在。函數可以接受輸入數據,并且根據輸入數據進行一系列操作,最后可以返回一個或多個結果。Python是一種非常流行的編程語言,也支持
    的頭像 發(fā)表于 11-21 16:37 ?960次閱讀

    sort函數python用法

    sort()函數Python的內置函數之一,用于對可迭代對象進行排序。可迭代對象包括列表、元組和字符串等。sort()函數是一個靈活而強
    的頭像 發(fā)表于 11-21 15:15 ?1067次閱讀

    range()函數的用法是什么

    range()函數Python的內置函數,用于生成一個整數序列,可以用于循環(huán)或創(chuàng)建列表。 range()函數的基本語法是: range(
    的頭像 發(fā)表于 11-21 14:46 ?2987次閱讀

    pythoninsert函數的用法

    Python的insert()函數用于在列表的指定位置插入元素。它的基本語法如下: list .insert(index, element) 其中,index表示要插入元素的位置,
    的頭像 發(fā)表于 11-21 14:43 ?2281次閱讀

    python如何定義一個函數

    一、Python3 函數 函數是組織好的,可重復使用的,用來實現單一,或相關聯(lián)功能的代碼段。 函數能提高應用的模塊性,和代碼的重復利用率。你已經知道
    的頭像 發(fā)表于 11-14 11:26 ?616次閱讀

    ADC配置參數說明

    ADC配置參數說明
    發(fā)表于 10-19 07:26

    python定義函數與調用函數的順序

    定義函數與調用函數的順序 函數被定義后,本身是不會自動執(zhí)行的,只有在被調用后,函數才會被執(zhí)行,得到相應的結果。但是在 Python
    的頭像 發(fā)表于 10-04 17:17 ?1075次閱讀

    一文詳解python調用函數

    函數被定義后,本身是不會自動執(zhí)行的,只有在被調用后,函數才會被執(zhí)行,得到相應的結果。但是在 Python 我們要注意一個關鍵點,就是Python
    發(fā)表于 10-01 10:45 ?531次閱讀