如何根据原始图像和去噪图像得到噪声?

How to get the noise based on the original image and denoised image?

我在做降噪工作,对Python不是很熟悉。我应用了BM3D去噪后的图片,我也有原图

现在我想通过这样做来获得噪音:

tmp = img - img_denoised

但结果是这样一个非常奇怪的黑白图:

那么我怎样才能得到合适的噪点图片呢?我希望得到的是这样的图像:

编辑: 从网上找了一张图片,做了同样的处理。

处理后:

再次编辑:

提供一个简单的例子:

import cv2

img = cv2.imread("path of the original image")

img_denoised = cv2.imread("path of the denoised image")

tmp = img - img_denoised

cv2.imwrite("test_noise.jpg",tmp)

由于信息有限,很难确定问题所在。请提供输入图片和更多代码。

看起来结果图像是二进制位图,只有白色或黑色,没有灰色。您的 tmp 图像的像素格式可能不正确,这可能是由于您的 img 和 img_denoised 没有相同的像素格式,或者两者都是错误的。尝试显示您的输入图像,看看它们看起来是否正常。

你的img和img_denoised应该是相同的像素格式,可能是8位灰度,或者24位RGB,img-img_denoised之后的结果应该还是相同的像素格式.

也可能是因为它是无符号的,尝试让它有符号,或者对所有像素 + 128,看看发生了什么。

你的图像数据是什么type/range? 0-1 还是 0-255?

如果你的图像是0-1 float32,噪声图像的数据范围是[-1, 1],大约一半的像素在0以下,当被cv2.imshow()显示为“黑色".

尝试

noise = origin - clean
noise = (noise + 1) * 0.5

在您的示例代码中,imgimg_denoised 都是 uint8 NumPy 数组。对这些数组进行操作时,输出的类型相同。这些运算都是以256为模的。当运算结果超过255时,回绕到0,结果为负数时,回绕到255。例如:

np.array([5], np.uint8) - np.array([10], np.uint8)

returnarray([251], dtype=uint8)。而不是 -5,它不能用 uint8 值表示,我们得到 256 - 5 = 251.

减法 img - img_denoised 导致一些值略高于零,看起来是黑色,而一些值刚好低于零,将存储为接近 255 的值,看起来是白色。

我们可以用不同的方式解决这个问题。一种是强制使用浮点值进行操作:

tmp = img.astype(float) - img_denoised.astype(float)

我们现在有一个浮点数数组,其中大约一半是负数。但是 JPEG 文件只能存储 uint8 值,将我们的浮点值转换为 uint8 将使我们回到起点。所以我们需要将原点(零值)移动到中间灰色(通常为 128):

tmp = img.astype(float) - img_denoised.astype(float)
tmp += 128
cv2.imwrite("test_noise.jpg", tmp.astype(np.uint8))

这很繁琐,但确实有效。我更喜欢使用为我处理数据类型的库,这样我就不必在不想的时候考虑它们。 DIPlib就是这样一个库(免责声明:我是作者):

import diplib as dip

img = dip.ImageRead("7yJS3.png")
img_denoised = dip.ImageRead("xjQIy.png")

tmp = img - img_denoised
tmp += 128
dip.ImageWrite(tmp, "test_noise.jpg")

在 DIPlib 中,除非我们明确阻止,否则算术运算会自动将图像提升为浮点类型。另存为 JPEG 时会自动将图像转换为 uint8(如果像素值超出 uint8 类型的范围,则会在此处发生错误)。