将特定像素替换为 rgb 和白色
Replace specific pixels by rgb with white color
有这样一张图片
我用网站检测背景的rgb是42,44,54。旨在将具有该 rgb 的像素替换为白色
这是我的尝试,但我没有得到预期的输出
import cv2
import numpy as np
# Load image
im = cv2.imread('Sample.png')
# Make all perfectly green pixels white
im[np.all(im == (42,44,54), axis=-1)] = (255, 255, 255)
# Save result
cv2.imwrite('Output.png',im)
我再次搜索并找到了以下代码(有些工作)
from PIL import Image
img = Image.open("Sample.png")
img = img.convert("RGB")
datas = img.getdata()
new_image_data = []
for item in datas:
# change all white (also shades of whites) pixels to yellow
if item[0] in list(range(42, 44)):
new_image_data.append((255, 255, 255))
else:
new_image_data.append(item)
# update image data
img.putdata(new_image_data)
# save new image
img.save("Output.png")
# show image in preview
img.show()
我还需要将除白色像素以外的任何其他 rgb 更改为黑色。简单的把背景颜色去掉后所有彩色字符变成黑色
我还在努力中(等待高手投稿,提供更好的解决方案)。下面的还不错,目前还不是很完善
from PIL import Image
import numpy as np
img = Image.open("Sample.png")
width = img.size[0]
height = img.size[1]
for i in range(0,width):
for j in range(0,height):
data = img.getpixel((i,j))
if (data[0]>=36 and data[0]<=45) and (data[1]>=38 and data[1]<=45) and (data[2]>=46 and data[2]<=58):
img.putpixel((i,j),(255, 255, 255))
if (data[0]==187 and data[1]==187 and data[2]==191):
img.putpixel((i,j),(255, 255, 255))
img.save("Output.png")
我想到了使用 Pillow 将图像转换为灰度
from PIL import Image
img = Image.open('Sample.png').convert('LA')
img.save('Grayscale.png')
图像变清晰了,但是这种模式下如何替换rgb像素?我尝试了与之前相同的代码并更改了 rgb 值但没有用,并且由于模式为 L
而出现错误
您可以一次完成两个步骤:
from PIL import Image
def is_background(item, bg):
# Tweak the ranges if the result is still unsatisfying
return (item[0] in range(bg[0] - 20, bg[0] + 20)) or \
(item[1] in range(bg[1] - 20, bg[1] + 20)) or \
(item[2] in range(bg[2] - 20, bg[2] + 20))
img = Image.open("Sample.png")
img = img.convert("RGB")
datas = img.getdata()
bg = [42, 44, 54] # Background RGB color
new_image_data = []
for item in datas:
# change all background to white and keep all white
if is_background(item, bg) or item == (255, 255, 255):
new_image_data.append((255, 255, 255))
else:
# change non-background and non-white to black
new_image_data.append((0, 0, 0))
img.putdata(new_image_data)
img.save("Output.png")
img.show()
这里是 result.
注意:
我们需要is_background
因为背景颜色不完全一样,有非常细微的变化
这种检测背景的方法非常基础,还有更复杂的方法。
问题是 OpenCV 遵循 BGR 格式并且您的像素值为 RGB。按如下方式修复。
# Make all perfectly green pixels white
im[np.all(im == (54,44,42), axis=-1)] = (255, 255, 255)
有这样一张图片
我用网站检测背景的rgb是42,44,54。旨在将具有该 rgb 的像素替换为白色 这是我的尝试,但我没有得到预期的输出
import cv2
import numpy as np
# Load image
im = cv2.imread('Sample.png')
# Make all perfectly green pixels white
im[np.all(im == (42,44,54), axis=-1)] = (255, 255, 255)
# Save result
cv2.imwrite('Output.png',im)
我再次搜索并找到了以下代码(有些工作)
from PIL import Image
img = Image.open("Sample.png")
img = img.convert("RGB")
datas = img.getdata()
new_image_data = []
for item in datas:
# change all white (also shades of whites) pixels to yellow
if item[0] in list(range(42, 44)):
new_image_data.append((255, 255, 255))
else:
new_image_data.append(item)
# update image data
img.putdata(new_image_data)
# save new image
img.save("Output.png")
# show image in preview
img.show()
我还需要将除白色像素以外的任何其他 rgb 更改为黑色。简单的把背景颜色去掉后所有彩色字符变成黑色
我还在努力中(等待高手投稿,提供更好的解决方案)。下面的还不错,目前还不是很完善
from PIL import Image
import numpy as np
img = Image.open("Sample.png")
width = img.size[0]
height = img.size[1]
for i in range(0,width):
for j in range(0,height):
data = img.getpixel((i,j))
if (data[0]>=36 and data[0]<=45) and (data[1]>=38 and data[1]<=45) and (data[2]>=46 and data[2]<=58):
img.putpixel((i,j),(255, 255, 255))
if (data[0]==187 and data[1]==187 and data[2]==191):
img.putpixel((i,j),(255, 255, 255))
img.save("Output.png")
我想到了使用 Pillow 将图像转换为灰度
from PIL import Image
img = Image.open('Sample.png').convert('LA')
img.save('Grayscale.png')
图像变清晰了,但是这种模式下如何替换rgb像素?我尝试了与之前相同的代码并更改了 rgb 值但没有用,并且由于模式为 L
而出现错误您可以一次完成两个步骤:
from PIL import Image
def is_background(item, bg):
# Tweak the ranges if the result is still unsatisfying
return (item[0] in range(bg[0] - 20, bg[0] + 20)) or \
(item[1] in range(bg[1] - 20, bg[1] + 20)) or \
(item[2] in range(bg[2] - 20, bg[2] + 20))
img = Image.open("Sample.png")
img = img.convert("RGB")
datas = img.getdata()
bg = [42, 44, 54] # Background RGB color
new_image_data = []
for item in datas:
# change all background to white and keep all white
if is_background(item, bg) or item == (255, 255, 255):
new_image_data.append((255, 255, 255))
else:
# change non-background and non-white to black
new_image_data.append((0, 0, 0))
img.putdata(new_image_data)
img.save("Output.png")
img.show()
这里是 result.
注意:
我们需要
is_background
因为背景颜色不完全一样,有非常细微的变化这种检测背景的方法非常基础,还有更复杂的方法。
问题是 OpenCV 遵循 BGR 格式并且您的像素值为 RGB。按如下方式修复。
# Make all perfectly green pixels white
im[np.all(im == (54,44,42), axis=-1)] = (255, 255, 255)