web-dev-qa-db-ja.com

cv2.equalizeHistの使用中にエラーが発生しました

次のコードを使用して、グレーレベル画像のヒストグラムを均等化しようとしています。

import cv2
im = cv2.imread("myimage.png")
eq = cv2.equalizeHist(im)

次の例外が発生します。

error: (-215) CV_ARE_SIZES_EQ(src, dst) && CV_ARE_TYPES_EQ(src, dst) && CV_MAT_TYPE(src->type) == CV_8UC1 in function cvEqualizeHist

Opencvのバージョンは2.4.2

何か推測はありますか?

11
Shan

cv2.equalizeHistは、グレースケール(1チャネル)画像でのみ機能します。どちらか:

im = cv2.imread("myimage.png", 0)        # load as grayscale

または:

im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) # or convert
22
berak

同じエラーが発生しました。解決策は次のとおりです。

  1. おかげで:zwep( cv2.equalizeHistを使用したエラー )とReti43( 画像タイプint16からuint8への変換

  2. エラー

エラーは、zwepが言ったように配列のdtypeが原因です。ただし、img.astype(np.uint8)またはnp.uint8(img)だけを使用することはできません。画像が変わります。これが結果です。

  • 生の画像(img):

enter image description here

plt.imshow(np.uint8(img),cmap=plt.cm.gray)

enter image description here

  1. 解決

    img1=np.uint8(cv2.normalize(img, None, 0, 255, cv2.NORM_MINMAX))
    plt.imshow(cv2.equalizeHist(img1),cmap=plt.cm.gray)
    

enter image description here

PS:適応ヒストグラム均等化はMRIに適しています。

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
plt.imshow(clahe.apply(img1),cmap=plt.cm.gray)

enter image description here

9
Ningrong Ye

他の誰かがこれに遭遇したが、すでにグレースケール($ M\times N $)ndarraysを使用している場合...別の問題がある可能性があります。

cv2.imread()を使用すると、dtype=np.uint8を使用して画像をnumpyndarrayとして読み込みます。ただし、他の方法を使用すると、dtype=np.uint16として保存でき、次の警告がトリガーされます

OpenCV Error: Assertion failed (_src.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3))) in cv::equalizeHist, file C:\projects\opencv-python\opencv\modules\imgproc\src\histogram.cpp, line 3913
Traceback (most recent call last):
  File "<input>", line 1, in <module>
cv2.error: C:\projects\opencv-python\opencv\modules\imgproc\src\histogram.cpp:3913: error: (-215) _src.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) in function cv::equalizeHist

解決:

img_int8 = img.astype(np.uint8)

編集:しかし、何か間違ったことをしている可能性があります...出力が変換のいくつかのケースで奇妙な結果をもたらすためです。

1
zwep