在OpenCV 3中,如何使用EngalZeistor等功能,在元素操作(Python和C++)之后

2024-09-28 18:50:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经对我的图像进行了元素操作。(实际上,我实现了一个算法来去除污迹。请注意,avggrad、I0avggrad、avg和I0avg都是mat类型,包含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

使用这个之后,我想执行直方图均衡化

^{pr2}$

但我不能这样做,因为我得到了以下错误

"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的函数可能会有所帮助,对吗?)在


Tags: 图像image元素ascv2avgjpgup
1条回答
网友
1楼 · 发布于 2024-09-28 18:50:51

正如评论中提到的,在使用equalizeHist()之前,您需要将矩阵转换为uchars

C++版本:

A.convertTo(A, CV_8UC1);

Python版本:

^{pr2}$

我还注意到你的一些矩阵有负数项,并且在范围[-128127]之间。您可能需要将它们移到[0255]范围,以避免丢失信息。在

相关问题 更多 >