次のコードを使用して、グレーレベル画像のヒストグラムを均等化しようとしています。
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
何か推測はありますか?
cv2.equalizeHistは、グレースケール(1チャネル)画像でのみ機能します。どちらか:
im = cv2.imread("myimage.png", 0) # load as grayscale
または:
im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) # or convert
同じエラーが発生しました。解決策は次のとおりです。
おかげで:zwep( cv2.equalizeHistを使用したエラー )とReti43( 画像タイプint16からuint8への変換 )
エラー
エラーは、zwepが言ったように配列のdtypeが原因です。ただし、img.astype(np.uint8)
またはnp.uint8(img)
だけを使用することはできません。画像が変わります。これが結果です。
plt.imshow(np.uint8(img),cmap=plt.cm.gray)
解決
img1=np.uint8(cv2.normalize(img, None, 0, 255, cv2.NORM_MINMAX))
plt.imshow(cv2.equalizeHist(img1),cmap=plt.cm.gray)
PS:適応ヒストグラム均等化はMRIに適しています。
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
plt.imshow(clahe.apply(img1),cmap=plt.cm.gray)
他の誰かがこれに遭遇したが、すでにグレースケール($ 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)
編集:しかし、何か間違ったことをしている可能性があります...出力が変換のいくつかのケースで奇妙な結果をもたらすためです。