改变与确定颜色接触的样本像素的颜色 - 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 个杂散像素。
我有这张图片:
而且我想用红色像素来改变刚好与黑色像素接触的白色像素组。可以使用此代码将特定颜色替换为另一种颜色:
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 个杂散像素。