【发布时间】: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