画像に対して要素ごとの操作を実行しました。(本質的に、汚れマークを除去するアルゴリズムを実装しました。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 という関数が役立つかもしれません。そうですか?)