在OpenCV裡資料型別不對導致邊緣消失

2021-09-28 14:47:55 字數 1550 閱讀 5682

在opencv裡,有時候使用不對的資料型別,比如cv.cv_8u或np.uint8時,可能會出錯的,下面就來舉乙個例子,如下:

#python 3.7.4,opencv4.1

#蔡軍生

#import numpy as np

import cv2

from matplotlib import pyplot as plt

plt.rcparams['font.sans-serif']=['simhei'] #用來正常顯示中文標籤

plt.rcparams['axes.unicode_minus']=false #用來正常顯示負號

#讀取檔案

img = cv2.imread('box1.png',0)

#輸出的資料型別dtype = cv.cv_8u

sobelx8u = cv2.sobel(img,cv2.cv_8u,1,0,ksize=5)

#輸出的資料型別dtype = cv.cv_64f,然後取絕對值absolute,再轉換為cv.cv_8u

sobelx64f = cv2.sobel(img,cv2.cv_64f,1,0,ksize=5)

abs_sobel64f = np.absolute(sobelx64f)

sobel_8u = np.uint8(abs_sobel64f)

plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')

plt.title('原圖'), plt.xticks(), plt.yticks()

plt.subplot(1,3,2),plt.imshow(sobelx8u,cmap = 'gray')

plt.title('sobel cv_8u型別'), plt.xticks(), plt.yticks()

plt.subplot(1,3,3),plt.imshow(sobel_8u,cmap = 'gray')

plt.title('sobel abs(cv_64f)型別'), plt.xticks(), plt.yticks()

plt.show()

#cv2.waitkey(0)

cv2.destroyallwindows()

結果輸出如下:

從上圖的原圖裡可以看到,垂直方向的邊緣有兩條,左邊一條右邊一條,如果只是使用cv.cv_8u型別時,發現右邊那一條邊緣不見了,為什麼會這樣呢?其實原因是這要,當從黑到白時,檢測出來邊緣是正值,轉換為cv.cv_8u型別正常;但是從白到黑時,檢測出來邊緣是負值,這時轉換為cv.cv_8u型別時,就強制轉換為0,因此就少了右邊的邊緣。所以對於cv.sobel()的函式計算時,要小心地使用合適的資料型別,否則會得不到正確的結果。最後乙個圖是因為採用了64位浮點數型別,並且求了絕對值,然後再做8位無符號的轉換,這樣結果就正常顯示出來了。因此,一般操作是使用cv.cv_16s, cv.cv_64f型別,然後取絕對值np.absolute,最後才轉換為cv.cv_8u型別。

OpenCV的資料型別

一般的影象檔案格式使用的是 unsigned 8bits。cvmat矩陣對應的引數型別就是cv 8uc1,cv 8uc2,cv 8uc3等。float 是32位的,對應cvmat資料結構引數就是 cv 32fc1,cv 32fc2,cv 32fc3等。double是64位,對應cvmat資料結構引數...

opencv中資料型別

cv 32fc1和cv 64fc1,前者是32位資料,後者是64位資料。因此前者型別的資料必須以指向32位資料型別的指標訪問,否則會報錯,而後者型別的資料必須以指向64位資料型別的指標訪問,否則會報錯。也就是說,你如果用cv 32fc1,那麼後面對該矩陣的輸入輸出的資料指標型別都應該是float,這...

opencv學習 opencv的資料型別 2

cv rect類 矩陣類包含point類的x,y 矩陣左上角 size類的width和height 矩陣大小 預設構造 cv rect r 拷貝構造 cv rect r2 r1 數值初始化 cv rect r x,y,w h 點座標及大小初始化構造 cv rect r p,sz 兩點初始化構造 cv...