这是一个python算法,可以改变背景颜色



在这个程序中,我想改变背景颜色。我通过Pillow读取图像,然后将其转换为numpy数组。提供一个坐标,算法应该从上、下、左、右检查邻居是否具有相同的颜色,如果其中一个邻居符合条件,那么他的坐标将被放置在队列中。程序没有返回错误,但是abs()函数返回一个不正确的结果。

from PIL import Image
import numpy as np
import time
start_time=time.time()
im=Image.open("Capturecasa.png")
data=np.asarray(im,dtype=np.uint8)
back=np.zeros(4,dtype=np.uint8)
back=data[200][1000].copy()
q=[[200,1000]]
u=10
m=[5,5,5,255]
print(back,"!!!!!")
while q:
i=q[0][0]
j=q[0][1]
k=0
if abs(data[i+1,j,0]-back[0])<u and abs(data[i+1,j,1]-back[1])<u and abs(data[i+1,j,2]-back[2])<u:
data[i+1,j]=m
k+1
q.append([i+1,j])
else:
print(back,"!!!!!")
print(data[i+1,j],abs(data[i+1,j,0]-back[0]),abs(data[i+1,j,1]-back[1]),abs(data[i+1,j,2]-back[2]))
if abs(data[i-1,j,0]-back[0])<u and abs(data[i-1,j,1]-back[1])<u and abs(data[i-1,j,2]-back[2])<u:
k+1
data[i-1,j]=m
q.append([i-1,j])
else:
print(back,"!!!!!")
print(data[i-1,j],abs(data[i-1,j,0]-back[0]),abs(data[i-1,j,1]-back[1]),abs(data[i-1,j,2]-back[2]))
if abs(data[i,j+1,0]-back[0])<u and abs(data[i,j+1,1]-back[1])<u and abs(data[i,j+1,2]-back[2])<u:
k+1
data[i,j+1]=m
q.append([i,j+1])
else:
print(back,"!!!!!")
print(data[i,j+1],abs(data[i,j+1,0]-back[0]),abs(data[i,j+1,1]-back[1]),abs(data[i,j+1,2]-back[2]))
if abs(data[i,j-1,0]-back[0])<u and abs(data[i,j-1,1]-back[1])<u and abs(data[i,j-1,2]-back[2])<u:
k+1
data[i,j-1]=m
q.append([i,j-1])
else:
print(back,"!!!!!")
print(data[i,j-1],abs(data[i,j-1,0]-back[0]),abs(data[i,j-1,1]-back[1]),abs(data[i,j-1,2]-back[2]))
del q[0]
if k==4:
print("yes")
#print(i,j,data[i+1,j],data[i-1,j],data[i,j+1],data[i,j-1])
im=Image.fromarray(data,'RGBA')
im.show()
print("--- %s seconds ---"%(time.time()-start_time))

我检查了我的abs()显示,函数返回错误的数字。

[204 208 211 255] !!!!!
[163 167 170 255] 215 215 215
[204 208 211 255] !!!!!
[  5   5   5 255] 57 53 50

嗯,在uint8上操作也限制了结果为uint8(所以abs是无用的,因为结果总是0…255)。

>>> item1
array([155,  59,  69], dtype=uint8)
>>> back
array([255, 255, 255], dtype=uint8)
>>> item1 - back  # uint8 255 is like -1 int8
array([156,  60,  70], dtype=uint8)
>>> abs(item1 - back)
array([156,  60,  70], dtype=uint8)

我建议您使用您的图像像素作为int16;我还建议你计算像素颜色的距离:

np.sqrt(np.sum(np.square(data[i,j,:3] - back[:3])))

。搜索颜色是否在背面颜色周围半径为10的球体内,而不是边为20的立方体内。

(可能有一个更方便的函数,我现在不记得了)

最新更新