如何根据原始图像和去噪图像得到噪声?
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
在您的示例代码中,img
和 img_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
类型的范围,则会在此处发生错误)。
我在做降噪工作,对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
在您的示例代码中,img
和 img_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
类型的范围,则会在此处发生错误)。