【问题标题】:The mask I am creating is clipping the image I am trying to paste over it我正在创建的蒙版正在剪切我要粘贴的图像
【发布时间】:2021-12-26 15:01:45
【问题描述】:

我正在尝试将图像(噪声)粘贴到背景图像(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)


【问题讨论】:

  • “这是一个正确的规范化” - 老实说,我不会这么说。您将其转换为 int,因此您正在执行二进制掩码 - 但您的原始图像不是二进制的,它具有柔和的边缘(抗锯齿),并且您正在将其缩小很多(产生更多的灰色)。使用 /255 只有纯白色变成白色,任何灰色,即使是非常浅的灰色,都会变成黑色。如果您没有二进制(只有纯白色和纯黑色,没有灰色,没有抗锯齿)图像,255 绝不是一个好的阈值。 255 可能是一个很好的阈值,如果您将玩腐蚀和膨胀以使边缘达到您想要的形状。

标签: python numpy opencv computer-vision


【解决方案1】:

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

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

展示它,而不是仅仅说:

我在 GIMP 中加载了你的蒙版,我在 gimp 中加载了你的蒙版图片,获得了“按颜色选择”工具,禁用抗锯齿并将阈值设为 0 - 一切都只有 白色 FFFFFF 被选中,与您的代码相同

啊,我们看到了漏洞。尾巴已经是像素了,头发也一样……脸上有个洞……洞的颜色是#FEFEFE - 254,黑色,阈值为255。

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

tl;dr:

  • 阈值 255 只会使 #FFFFFF 变为白色,它永远不会
  • 您的图片有很多“视觉上是白色但不是 #FFFFFF 白色”像素
  • 使用较低的阈值并没有什么不好,即使是伪黑白范围的中间值

【讨论】:

  • [顺便说一句,GIMP 默认选择的阈值(+- 适用于合并相似颜色)为 15 - 所以当您达到纯白色 (255) 时,它会准确选择您的 240 阈值。您可以像这样玩它以更好地理解它。 :)]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
相关资源
最近更新 更多