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