颜色迁移-将图像颜色调整为目标图像的基本颜色

目标:将随机的图像的颜色调整为目标图像的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")  

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值