改变与确定颜色接触的样本像素的颜色 - python

Change color of a sample pixels in contact with a determinated color - python

我有这张图片:

而且我想用红色像素来改变刚好与黑色像素接触的白色像素组。可以使用此代码将特定颜色替换为另一种颜色:

import numpy as np
from PIL import Image

im = Image.open('fig1.png')
data = np.array(im)

r1, g1, b1 = 255, 255, 255 # Original value
r2, g2, b2 = 0, 0, 0 # Value that we want to replace it with

red, green, blue = data[:,:,0], data[:,:,1], data[:,:,2]
mask = (red == r1) & (green == g1) & (blue == b1)
data[:,:,:3][mask] = [r2, g2, b2]

im = Image.fromarray(data)

是否可以将白色像素样本替换为红色像素,但只是白色像素与黑色像素接触?

更新答案

我仍然不能 100% 确定你想要什么,但这应该为你做你想做的事打下良好的基础:

#!/usr/bin/env python3

from PIL import Image
import numpy as np
from skimage.morphology import dilation

# Load image - and make into Numpy array
# It is a palette image. 0=black, 1=white, 2=red
im = Image.open('start.png')
na = np.array(im)

# Make mask of white pixels - True where white
whiteMask = na==1
Image.fromarray((whiteMask*255).astype(np.uint8)).save('DEBUG-whiteMask.png')

# Make mask of black pixels - True where black
blackMask = na==0
Image.fromarray((blackMask*255).astype(np.uint8)).save('DEBUG-blackMask.png')

# Footprint of structuring element for morphology
# Unused at the moment:
# footprint = np.zeros((3, 3), dtype=np.uint8)
# footprint[1, 1] = 1

# Do the morphology on blackMask
touchingBlack = dilation(blackMask, footprint=None)

# Now find pixels that are both white and touching black
resultMask = np.logical_and(whiteMask, touchingBlack)
Image.fromarray((resultMask*255).astype(np.uint8)).save('DEBUG-resultMask.png')

# Make those pixels red
na[resultMask] = 2

# Convert back into PIL Image and reinstate original palette
res = Image.fromarray(na)
res.putpalette(im.getpalette())
res.save('result.png')

它使用我的 “已更正” 从下面开始的图像,并生成这个:

原答案

我会更新这个答案if/when你提供了一个像样的无损 PNG 输入图像并澄清你所说的“像素接触黑色”.

目前,我已经“更正”你的图片只有三种颜色:

并在终端中使用 ImageMagick 尝试我的算法以方便使用,直到我们确定目标是什么。

# Find white pixels
magick start.png -fill black +opaque white white.png

# Find black pixels
magick start.png -fill white +opaque black -negate black.png

# Find pixels touching black pixels
magick black.png -morphology dilate square:1 black-d.png

# Find black pixels that are both white and touching black
magick white.png black-d.png -compose darken -composite result.png


“更正” 原始图像,这是一个有损的 JPEG 到三色 PNG 如下...

首先,我制作了我想要将图像重新映射到的 3 种纯色的样本。我用 ImageMagick 做到了,如下所示:

magick xc:red xc:black xc:white +append swatch.png

这样就形成了一个 3x1 的小图像,其中包含 1 个红色、1 个黑色和 1 个白色像素。然后我使用 ImageMagick 将原始图像重新映射到这 3 种颜色,使用:

magick original.jpg +dither -remap swatch.png start.png

然后我 hand-edited 6-8 个杂散像素。