1

画像に対して要素ごとの操作を実行しました。(本質的に、汚れマークを除去するアルゴリズムを実装しました。avggrad、I0avggrad、avg、および I0avg はすべて float を要素として含むマット タイプであることに注意してください)

a = avggrad/I0avggrad
b = avg - I0avg * a

originalImg = cv2.imread("testImage.jpg",0) #load as a grayscale
cleanImg = (originalImg - b)/a
cv2.imwrite("Step1.jpg",cleanImg) # the image opens up in gimp as a cleaned up image

これを使用した後、ヒストグラムの均等化を実行したい

img = cv2.equalizeHist(cleanImg)

しかし、次のエラーが発生するため、それを行うことはできません

"Assertion failed (_src.type() == CV_8UC1)"

画像形式の特定の不一致が原因であることに気付きました。短期的には、ちょっとした回避策があります。画像を保存し、保存した画像をロードすると、機能します。しかし、私はより良い方法を知りたいです。冗長にするために、このコードも書き留めます

追加情報として、印刷時にマトリックスの出力を提供しています

の出力

print cleanImg

[[   0 -123 -121 ..., -126 -117    0]
 [ 119  126 -127 ..., -127 -124 -121]
 [ 122 -128 -125 ..., -123 -126 -117]
 ..., 
 [-126  127  126 ..., -124 -125 -125]
 [-128 -127  127 ..., -123 -123 -121]
 [   0 -126  127 ..., -120 -123    0]]

次のコードの出力

reloadedImage = cv2.imread("Step1.jpg",0)
print reloadedImage

は:

[[  0 135 136 ..., 129 138   0]
 [121 126 128 ..., 130 136 136]
 [122 124 133 ..., 135 129 140]
 ..., 
 [128 124 129 ..., 135 128 131]
 [131 131 126 ..., 131 136 137]
 [  0 132 129 ..., 135 134   0]]

明らかに変換が行われています。誰かがこれについてもっと良い方法を提案できますか? マトリックス「avggrad、I0avggrad、avg、I0avg」を整数に変換してから続行する必要がありますか?

また、後でC++でこれを実装する必要があるため、C++で同様の問題を解決する方法を提案してください。同様の問題に遭遇した他の人に役立つと確信しています。(私の知る限り、convertTo という関数が役立つかもしれません。そうですか?)

4

1 に答える 1

0

コメントで述べたように、使用する前に行列を uchars に変換する必要がありますequalizeHist()

C++ バージョン:

A.convertTo(A, CV_8UC1);

Python バージョン:

A = A.astype(np.uint8)

また、行列の一部に負のエントリがあり、[-128, 127] の範囲にあることにも気付きました。情報が失われないように、[0, 255] の範囲にシフトすることをお勧めします。

于 2015-12-13T12:56:43.430 に答える