我正在创建的蒙版正在剪裁我试图粘贴到它上面的图像

The mask I am creating is clipping the image I am trying to paste over it

我正在尝试将图像(噪声)粘贴到背景图像(back_eq)之上。 问题是当应用蒙版时 (mask = np.uint8(alpha/255) 蒙版被剪裁 clipped mask 这是我要粘贴的原始形状 the white shape should get onto the background (but black) 所以结果是 clipped result

当我们使用更小的值 s.a 245 或 240 (mask = np.uint8(alpha/240)) 而不是使用 255 进行归一化时,问题得到解决 问题是这是一个正确的规范化。关于如何通过强制正确的归一化来修复掩码有什么建议吗?

import numpy as np
import cv2
import matplotlib.pyplot as plt

noise = cv2.imread("3_noisy.jpg")
noise = cv2.resize(noise,(300,300), interpolation = cv2.INTER_LINEAR)
alpha = cv2.imread("3_alpha.jpg")
alpha = cv2.resize(alpha,(300,300), interpolation = cv2.INTER_LINEAR)
back_eq = cv2.imread('Results/back_eq.jpg')

back_eq_crop = cv2.imread('Results/back_eq_crop.jpg')
im_3_tone = cv2.imread('Results/im_3_tone.jpg')

final = back_eq.copy()
back_eq_h, back_eq_w, _ = back_eq.shape
noisy_h, noisy_w,_ = noise.shape


l1 = back_eq_h//2 - noisy_h//2
l2 = back_eq_h//2 + noisy_h//2
l3 = back_eq_w//2 - noisy_w//2
l4 = back_eq_w//2 + noisy_w//2
print(alpha.shape)

# normalizing the values
mask = np.uint8(alpha/255)
# masking back_eq_crop
masked_back_eq_crop = cv2.multiply(back_eq_crop,(1-mask))
cv2.imshow('as',masked_back_eq_crop)
cv2.waitKey(0)
cv2.destroyAllWindows()



# creating the masked region
mask_to_add = cv2.multiply(im_3_tone, mask)
cv2.imshow('as',mask_to_add)
cv2.waitKey(0)
cv2.destroyAllWindows()
# Combining
masked_image = cv2.add(masked_back_eq_crop, mask_to_add)
final[l1:l2, l3:l4] = masked_image
cv2.imshow('aa',masked_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

plt.figure()
plt.imshow(final[:, :, ::-1]);plt.axis("off");plt.title("Final Image")
plt.show()

retval=cv2.imwrite("Results/Final Image.jpg", final)


要使用 255 的二进制掩码阈值,您必须准备好正确的图像 - 最好已经是二进制的。因为 255 意味着只有纯白色 (#FFFFFF) 会保持白色 。再浅的灰色也会变成黑色

在您的情况下,嗯...图像具有抗锯齿功能(边缘被柔化),并且您正在代码中进行缩放。但是而且,你的白也不是纯白的。结果有漏洞

展示它,而不仅仅是说话:

我在 GIMP 中加载了你的蒙版,我在 gimp 中加载了你的蒙版图片,得到了 'select by colour' 工具,禁用了抗锯齿并将阈值设置为 0 - 一切都是为了只有 pure white FFFFFF 被选中,与您的代码相同

Aaa,我们看到了漏洞。尾巴已经像素化了,和头发一样......脸上的洞在那里......洞的颜色是#FEFEFE - 254,使它变成黑色,阈值是 255。

这种(伪)“black-and-white”中的最佳阈值实际上在中间(128)附近。因为抗锯齿使边缘成为 blackish-gray 或 whiteish-gray - 没有中间灰色,所以中间灰色很好地将两组分开。你的“视觉上是白色但不是纯白色”(+类似的黑人)也进入了这些群体。即使您认为您的图像中只有纯黑色和纯白色 - 如果您将其加载为彩色或灰度,无论如何您都有 0 和 255 个值,因此 128 将起作用。 (我现在无法访问我的旧代码,但我相信我在处理图像时将阈值保持在 200 左右?)

tl;dr:

  • 阈值 255 只会使 #FFFFFF 变白,永远不会
  • 你的图片有很多“视觉上是白色但不是#FFFFFF 白色”像素
  • 使用较低的阈值并没有什么不好,即使在伪 black-and-white
  • 的范围中间也是如此