为什么在向具有不同数据类型的二进制图像添加噪声时得到不同的结果
Why do I get different results while adding noise to a binary images which have different dtypes
我使用以下代码生成图像,然后添加白噪声,最后对最终图像进行形态学操作(开运算)。
**问题** - 为什么我在添加带有 UINT8 噪声的 UINT8 图像时得到不同的结果 (Result-1)
img1 = np.zeros((300,600),np.uint8)
cv2.putText(img1, 'ABCD', org=(100,200), fontFace=cv2.FONT_ITALIC, fontScale=5, color=(255,255,255), thickness=25)
img2 = np.zeros((300,600))
cv2.putText(img2, 'ABCD', org=(100,200), fontFace=cv2.FONT_ITALIC, fontScale=5, color=(255,255,255), thickness=25)
noise1 = np.random.randint(low=0, high=2, size=(300,600), dtype=np.uint8)
noise2 = np.random.randint(low=0, high=2, size=(300,600))
noise1_img1 = img1+(noise1*255)
noise2_img2 = img2+(noise2*255)
noise1_img2 = img2+(noise1*255)
noise2_img1 = img1+(noise2*255)
结果:
Uint8 dtypes 本质上限制为 0 到 255 之间的值。因此,当您将一个值为 255 的值(在您的例子中为白色文本)与另一个 uint8 值相加时,它不会有任何变化更高,上限为 255(忽略 under/overflow)。
现在,当您将 uint8 添加到更高位数的值(float、int、double 等)时,python 会固有地将结果转换为更大的位数。因此,如果您有一个 uint8 图像并向其添加 int32 噪声,则结果的值将能够高于 255(您将文本设置为)。要删除它,您需要将结果转换为 uint8:
noise2_img2 = (img2+(noise2*255)).astype(np.uint8)
或者将字体值 (255,255,255) 设置为 int32 的最大值:2,147,483,647!
我使用以下代码生成图像,然后添加白噪声,最后对最终图像进行形态学操作(开运算)。
**问题** - 为什么我在添加带有 UINT8 噪声的 UINT8 图像时得到不同的结果 (Result-1)
img1 = np.zeros((300,600),np.uint8)
cv2.putText(img1, 'ABCD', org=(100,200), fontFace=cv2.FONT_ITALIC, fontScale=5, color=(255,255,255), thickness=25)
img2 = np.zeros((300,600))
cv2.putText(img2, 'ABCD', org=(100,200), fontFace=cv2.FONT_ITALIC, fontScale=5, color=(255,255,255), thickness=25)
noise1 = np.random.randint(low=0, high=2, size=(300,600), dtype=np.uint8)
noise2 = np.random.randint(low=0, high=2, size=(300,600))
noise1_img1 = img1+(noise1*255)
noise2_img2 = img2+(noise2*255)
noise1_img2 = img2+(noise1*255)
noise2_img1 = img1+(noise2*255)
结果:
Uint8 dtypes 本质上限制为 0 到 255 之间的值。因此,当您将一个值为 255 的值(在您的例子中为白色文本)与另一个 uint8 值相加时,它不会有任何变化更高,上限为 255(忽略 under/overflow)。
现在,当您将 uint8 添加到更高位数的值(float、int、double 等)时,python 会固有地将结果转换为更大的位数。因此,如果您有一个 uint8 图像并向其添加 int32 噪声,则结果的值将能够高于 255(您将文本设置为)。要删除它,您需要将结果转换为 uint8:
noise2_img2 = (img2+(noise2*255)).astype(np.uint8)
或者将字体值 (255,255,255) 设置为 int32 的最大值:2,147,483,647!