在 OpenCV 3.0 中如何在元素操作之后使用像 equalizeHist 这样的函数(python 和 C++)
In OpenCV 3.0 how to use functions like equalizeHist after elementwise operations (both python and C++)
我已经对我的图像进行了元素操作。 (基本上我实现了一个算法来去除污迹。注意avggrad,I0avggrad,avg和I0avg都是mat类型,包含floats作为元素)
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 and I0avg" 转换为整数然后继续?
另外请建议如何在 C++ 中解决类似的问题,因为我稍后必须在 C++ 中实现它,我相信它可能会帮助遇到类似问题的其他人。 (据我所知,一个名为 convertTo 的函数可能会有所帮助,对吗?)
如评论中所述,在使用 equalizeHist()
之前,您需要将矩阵转换为 uchars
C++ 版本:
A.convertTo(A, CV_8UC1);
Python版本:
A = A.astype(np.uint8)
我还注意到你的一些矩阵有负数,并且在 [-128, 127] 范围内。您可能希望将它们移动到 [0, 255] 范围以避免丢失信息。
我已经对我的图像进行了元素操作。 (基本上我实现了一个算法来去除污迹。注意avggrad,I0avggrad,avg和I0avg都是mat类型,包含floats作为元素)
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 and I0avg" 转换为整数然后继续?
另外请建议如何在 C++ 中解决类似的问题,因为我稍后必须在 C++ 中实现它,我相信它可能会帮助遇到类似问题的其他人。 (据我所知,一个名为 convertTo 的函数可能会有所帮助,对吗?)
如评论中所述,在使用 equalizeHist()
C++ 版本:
A.convertTo(A, CV_8UC1);
Python版本:
A = A.astype(np.uint8)
我还注意到你的一些矩阵有负数,并且在 [-128, 127] 范围内。您可能希望将它们移动到 [0, 255] 范围以避免丢失信息。