目标:将随机的图像的颜色调整为目标图像的7种主要颜色。也可以是10种,2种,可以自己定义。//也可以调整为自定义的多种颜色。

工具:python

原理:通过计算欧式距离。计算最近的RGB值。

1.将图像调整为自定义的颜色

from PIL import Image, ImageDraw, ImageFont

color=[(184,167,139),(72,53,47),(150,120,96),(111,87,63),(90,97,63),(140,125,80),(133,117,92),] #自己设定的颜色 可以是任意数量


def OsDistance(vector1, vector2): #计算欧式距离
    n1=float(vector1[0])
    n2 = float(vector1[1])
    n3 = float(vector1[2])
    m1=float(vector2[0])
    m2 = float(vector2[1])
    m3 = float(vector2[2])

    distance = ((n1-m1)**2+(n2-m2)**2+(n3-m3)**2)**0.5
    return distance


def calculate_distance( a,c): #找到最相近的颜色,并取出标签
    m=[]
    for ci in c:
        d=OsDistance(a,ci)
        m.append(d)
    t=m.index(min(m))
    return t



img = Image.open("mm8004.jpg")  # 读取系统的内照片

width = img.size[0]  # 长度
height = img.size[1]  # 宽度
temp = 1
for i in range(0, width):  # 遍历所有长度的点
    for j in range(0, height):  # 遍历所有宽度的点
        a=img.getpixel((i,j)) #获取像素点的RGB
        b=calculate_distance(a,color) #找最相近的颜色
        img.putpixel((i, j), color[b]) #换颜色
img = img.convert("RGB")  
img.save("mm80047.jpg")  # 保存修改像素点后的图片

输入:

结果:

 

2.先获取图像的基本颜色,再将图像调整为获取的基本颜色

from PIL import Image, ImageDraw, ImageFont



def get_dominant_colors(infile):#获取主要颜色
    image = Image.open(infile) 
    small_image = image.resize((80, 80))
    result = small_image.convert(
         "P", palette=Image.ADAPTIVE, colors=5)#修改数值为自己想要的颜色个数gu
    palette = result.getpalette()
    color_counts = sorted(result.getcolors(), reverse=True)
    colors = list()

    for i in range(5):
        palette_index = color_counts[i][1]
        dominant_color = palette[palette_index * 3: palette_index * 3 + 3]
        colors.append(tuple(dominant_color))
    return colors
image_path = "mc.jpg"
color = get_dominant_colors(image_path)
print(color)

def OsDistance(vector1, vector2):
    n1=float(vector1[0])
    n2 = float(vector1[1])
    n3 = float(vector1[2])
    m1=float(vector2[0])
    m2 = float(vector2[1])
    m3 = float(vector2[2])

    distance = ((n1-m1)**2+(n2-m2)**2+(n3-m3)**2)**0.5
    return distance


def calculate_distance( a,c):
    m=[]
    for ci in c:
        d=OsDistance(a,ci)
        m.append(d)
    t=m.index(min(m))
    return t



img = Image.open("mm8004.jpg")  

width = img.size[0]  
height = img.size[1]  
temp = 1
for i in range(0, width):  
    for j in range(0, height):  
        a=img.getpixel((i,j))
        b=calculate_distance(a,color)
        img.putpixel((i, j), color[b])
img = img.convert("RGB") 
img.save("mm80047.jpg")  

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐