python - Python-删除黑色轮廓并在JPEG图像上覆盖PNG图像

标签 python image opencv image-processing

我有两个图像:

绘画碎片

整幅画

我需要解决两个问题:

1号在第一个图像上,我需要从每个片段中删除黑色轮廓。我已经尝试了阈值和侵 eclipse ,但是它们都不起作用。我怎样才能做到这一点?

2号我无法在第二张图片上重叠第一张图片,而且我真的不知道为什么。它总是导致第一个图像完全重叠,并将黑色像素放在应该可以看到第二个图像的位置。

我在Ubuntu 18.04上使用Python3和OpenCV 3.2。

我的程序:

from PIL import Image
from matplotlib import pyplot as plt
import numpy as np
import cv2
import sys

plano_f = cv2.imread("Domenichino_Virgin-and-unicorn.jpg")
sobrepor = cv2.imread("Domenichino_Virgin-and-unicorn_img.png")

plano_f = cv2.cvtColor(plano_f, cv2.COLOR_BGR2GRAY, -1)

#sobrepor_BGRA = cv2.cvtColor(sobrepor, cv2.COLOR_BGR2BGRA)
sobrepor_BGRA = cv2.imread("nova_png.png", -1)
plt.imshow(sobrepor_BGRA),plt.show()

rows, cols, han = sobrepor_BGRA.shape
total = rows*cols

#printProgressBar(0, total, prefix="Executando...", suffix="completo", length=50)

'''for i in range(rows):
    for j in range(cols):
        if(sobrepor_BGRA[i, j][0] <= 5 and sobrepor_BGRA[i, j][1] <= 5 and sobrepor_BGRA[i, j][2] <= 5 and sobrepor_BGRA[i, j][3] != 0):
            sobrepor_BGRA[i, j] = (0, 0, 0, 0)

        #printProgressBar(i*j, total, prefix='Executando...', suffix='completo', length=50)
        sys.stdout.write("\rExecutando linha " + str(i) + " de " + str(rows) + "...")
        sys.stdout.flush()

cv2.imwrite("nova_png.png", sobrepor_BGRA)'''

kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))
#sobrepor_BGRA = cv2.cvtColor(sobrepor_BGRA, cv2.COLOR_BGRA2GRAY, -1)

sobrepor_BGRA = cv2.erode(sobrepor_BGRA, kernel, iterations=3)

#sobrepor_BGRA = cv2.cvtColor(sobrepor_BGRA, cv2.COLOR_GRAY2BGRA)

cv2.imwrite("nova_png2.png", sobrepor_BGRA)

#sobrepor_RGBA = cv2.cvtColor(sobrepor_BGRA, cv2.COLOR_BGRA2RGBA)
#plt.imshow(sobrepor_RGBA),plt.show()

sys.stdout.write("\nPronto!")

nova_img = cv2.addWeighted(sobrepor_BGRA, 1, plano_f, 0, 0)
cv2.imwrite("combined.png", nova_img)
plt.imshow(nova_img),plt.show()

最佳答案

您可以使用按位操作来执行此操作。这个想法是获得碎片丢失部分的掩码,然后按位或将两个部分放在一起。这是图像的两半,一个是您已经拥有的片段,另一个是缺少的部分。


我们将两半结合起来得到整幅画

import cv2
import numpy as np

fragment = cv2.imread('1.jpg')
whole = cv2.imread('2.jpg')
fragment[np.where((fragment <= [250,250,250]).all(axis=2))] = [0]
result1 = cv2.bitwise_and(whole, fragment)
result2 = cv2.bitwise_and(whole, 255 - fragment)
final = result1 + result2

cv2.imshow('result1', result1)
cv2.imshow('result2', result2)
cv2.imshow('final', final)
cv2.waitKey()

关于python - Python-删除黑色轮廓并在JPEG图像上覆盖PNG图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59276783/

相关文章:

python - 内存错误: bad allocation when Pycharm shows barely any memory use

opencv - 如何在原生 C++ 代码中的 android studio 中使用 opencv

node.js - OpenCV:未加载库:libjpeg.8.dylib

python - TensorFlow:是否可以恢复多 GPU 训练的检查点模型?

python - 为什么我必须为 SQLAlchemy 更改 Flask 中的 uri?

java - 从 IndexColorModel 获取索引?

android - 将 URI 转换为位图的问题 (2014) :

python - OneToOneField 中的 Django 模型字段

python - 尝试通过远程 api 调用运行 ansible playbook

c# - 将光栅字节[]图像数据转换为C#中的列格式