【问题标题】:It is a python algorithm that changes the background color这是一个改变背景颜色的python算法
【发布时间】:2021-08-17 07:39:37
【问题描述】:

在这个程序中,我想改变背景颜色。在将其转换为 numpy 数组后,我通过 Pillow 读取图像。提供一个坐标,算法应该从上、下、左、右检查邻居是否具有相同的颜色,如果其中一个邻居遵守条件,那么他的坐标将被放入队列中。程序没有返回错误,但是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

【问题讨论】:

    标签: python numpy python-imaging-library


    【解决方案1】:

    嗯,在 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 的立方体。

    (现在可能有一个更方便的功能让我无法理解)

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 1970-01-01
      • 2013-07-20
      • 2015-05-23
      • 2018-03-08
      • 2011-05-16
      • 2013-04-28
      相关资源
      最近更新 更多