【发布时间】:2020-07-28 17:09:30
【问题描述】:
我正在使用 Python 和 PIL(或 Pillow)并希望在包含给定强度的两个像素和 RGB 代码 (0,0,255) 的文件上运行代码。
像素也可能接近 (0,0,255) 但略有调整,即 (0,1,255)。我想用 (0,0,255) 覆盖最接近 (0,0,255) 的两个像素。
这可能吗?如果有,怎么做?
我正在查看的代码尝试来自这里:
# import the necessary packages
import numpy as np
import scipy.spatial as sp
import matplotlib.pyplot as plt
import cv2
from PIL import Image, ImageDraw, ImageFont
#Stored all RGB values of main colors in a array
# main_colors = [(0,0,0),
# (255,255,255),
# (255,0,0),
# (0,255,0),
# (0,0,255),
# (255,255,0),
# (0,255,255),
# (255,0,255),
# ]
main_colors = [(0,0,0),
(0,0,255),
(255,255,255)
]
background = Image.open("test-small.tiff").convert('RGBA')
background.save("test-small.png")
retina = cv2.imread("test-small.png")
#convert BGR to RGB image
retina = cv2.cvtColor(retina, cv2.COLOR_BGR2RGB)
h,w,bpp = np.shape(retina)
#Change colors of each pixel
#reference :https://stackoverflow.com/a/48884514/9799700
for py in range(0,h):
for px in range(0,w):
########################
#Used this part to find nearest color
#reference : https://stackoverflow.com/a/22478139/9799700
input_color = (retina[py][px][0],retina[py][px][1],retina[py][px][2])
tree = sp.KDTree(main_colors)
ditsance, result = tree.query(input_color)
nearest_color = main_colors[result]
###################
retina[py][px][0]=nearest_color[0]
retina[py][px][1]=nearest_color[1]
retina[py][px][2]=nearest_color[2]
print(str(px), str(py))
# show image
plt.figure()
plt.axis("off")
plt.imshow(retina)
plt.savefig('color_adjusted.png')
我的逻辑是将最接近的 RGB 颜色数组替换为仅包含 (0,0,255)(我想要的蓝色)和白色可能包含 (255,255,255) - 这样只有黑色、白色或蓝色的像素才能通过.
但是,代码会遍历每个像素,这对于较大的图像来说很慢(我使用的是 4000 x 4000 像素的图像)。我还想将图像输出并保存到与原始文件相同的尺寸(我希望在使用 plt.savefig 时可以选择。
如果这可以优化,那将是理想的。同样,选择两个“最蓝”(即最接近 (0,0,255))像素并用 (0,0,255) 重写它们对我来说应该更快且同样有效。
【问题讨论】:
-
您的链接似乎无效。此外,当您实际使用 OpenCV 时,您已经标记并说您正在使用 PIL。
-
修复了链接,并在我使用库打开 .tiff 并将其转换为该脚本的 .png 时保留了 PIL 标记(也更改了脚本)。
-
您的问题现在似乎不同了!最初,您想让最接近蓝色的两个像素变为完全蓝色,而其他颜色像素保持不变。这将给出具有 257 种颜色的输出图像,即蓝色和 256 种灰度。现在您似乎希望每个像素都呈现黑色、白色或蓝色,从而产生只有 3 种颜色的输出图像?
-
嗨,马克!老实说,前者更可取,只是我似乎对后者有解决方案。两者都符合我的目的,但出于速度目的,我肯定更喜欢前者。我认为后者会产生更精确的结果(因为只有三种颜色),但在处理所有 4000^2 像素时会慢得多。
-
嗨@MarkSetchell!对于那个很抱歉。刚刚点击它。
标签: python opencv matplotlib python-imaging-library