Python 颜色,python定义颜色

  Python 颜色,python定义颜色

  本文主要介绍使用Python进行图像颜色量化。本文通过示例代码向您详细介绍,对您的学习或工作有一定的参考价值。有需要的朋友可以参考一下。

  00-1010 1.选择图片2。创建脚本1。导入相关库2。创建方法3。完整代码。

  

目录

  首先选择一个图像。比如我会用下面这些海水和椰子树的照片。

  

一、选择图片

  

二、创建脚本

  接下来,让我们导入extcolors和rgb2hex库。extcolors库返回RGB值,这些值将使用rgb2hex库转换为十六进制颜色代码。

  将numpy作为np导入

  进口熊猫作为pd

  将matplotlib.pyplot作为plt导入

  将matplotlib.patches作为修补程序导入

  将matplotlib.image作为mpimg导入

  从PIL进口图片

  从matplotlib.offsetbox导入OffsetImage,AnnotationBbox

  如果在导入这两个库的时候出现了一些错误,可以尝试安装一些必备的库让它们工作。这些库在下面的代码中。删除!#符号在pip前面,然后运行以安装它们。请不要删除版本号前的#号。它们只是笔记。

  #!pip安装easydev #版本0.12.0

  #!pip安装色彩映射表#版本1.0.4

  #!pip安装opencv-python #版本4.5.5.64

  #!pip安装colorgram.py #版本1.2.0

  #!pip安装extcolors #版本1.0.0

  导入cv2

  导入外部颜色

  从色彩映射表导入rgb2hex

  

1、导入相关库

  接下来,我将一步一步地解释如何创建颜色提取的函数。如果想直接得到函数,请对函数的定义进行评分。

  调整图像大小

  首先准备输入图像。用现代相机和手机拍的照片太大了。有些人可以拍摄超过5000万像素的照片(4K显示器只能显示大约830万像素)。如果我们直接使用巨幅图像,处理可能需要一些时间。

  所以,首先要做的就是调整大小。下面的代码演示如何将图片的宽度调整为900像素。如果图像不是很大或者你的CPU很快,这一步可以省略,或者可以增加输出分辨率的数量。请注意,调整照片大小后,新照片将保存在您的计算机上,以供进一步阅读。

  input_name=照片位置/名称

  output _ width=900 #设置输出尺寸

  img=Image.open(input_name)

  wpercent=(output _ width/float(img . size[0])

  hsize=int((float(img . size[1])* float(wpercent)))

  img=img.resize((output_width,hsize),Image。抗锯齿)

  #保存

  resize _ name= resize _ input _ name #调整大小后的图像名称

  img . save(resize_name)#可以在resize _ name之前指定输出位置

  #阅读

  plt.figure(figsize=(9,9))

  img_url=resize_name

  img=plt.imread(img_u

  rl)

  plt.imshow(img)

  plt.axis(off)

  plt.show()

  颜色提取

  使用 extcolors 库提取颜色。 我们必须设置的参数:

  容差:对颜色进行分组以限制输出并提供更好的视觉表示。 基于从 0 到 100 的比例。其中 0 不会对任何颜色进行分组,而 100 会将所有颜色归为一个。

  限制:输出中呈现的提取颜色数量的上限。

  在下面的代码中,我将公差值设置为 12,并将颜色代码输出的数量限制为 11 种颜色(limit=12)。 可以根据需要更改数字。 获得的结果将是 RGB 颜色代码及其出现。

  

colors_x = extcolors.extract_from_path(img_url, tolerance = 12, limit = 12)

  colors_x

  使用 rgb2hex 库定义一个函数以将 RGB 代码转换为 HEX 颜色代码并创建一个 DataFrame。

  

def color_to_df(input):

   colors_pre_list = str(input).replace(([(,).split(, ()[0:-1]

   df_rgb = [i.split(), )[0] + ) for i in colors_pre_list]

   df_percent = [i.split(), )[1].replace(),) for i in colors_pre_list]

   #convert RGB to HEX code

   df_color_up = [rgb2hex(int(i.split(", ")[0].replace("(","")),

   int(i.split(", ")[1]),

   int(i.split(", ")[2].replace(")",""))) for i in df_rgb]

   df = pd.DataFrame(zip(df_color_up, df_percent), columns = [c_code,occurence])

   return df

  df_color = color_to_df(colors_x)

  df_color

  绘制图标

  

list_color = list(df_color[c_code])

  list_precent = [int(i) for i in list(df_color[occurence])]

  text_c = [c + + str(round(p*100/sum(list_precent),1)) +% for c, p in zip(list_color,

   list_precent)]

  fig, ax = plt.subplots(figsize=(90,90),dpi=10)

  wedges, text = ax.pie(list_precent,

   labels= text_c,

   labeldistance= 1.05,

   colors = list_color,

   textprops={fontsize: 120, color:black}

   )

  plt.setp(wedges, width=0.3)

  #create space in the center

  plt.setp(wedges, width=0.36)

  ax.set_aspect("equal")

  fig.set_facecolor(white)

  plt.show()

  

  

#create background color

  fig, ax = plt.subplots(figsize=(192,108),dpi=10)

  fig.set_facecolor(white)

  plt.savefig(bg.png)

  plt.close(fig)

  #create color palette

  bg = plt.imread(bg.png)

  fig = plt.figure(figsize=(90, 90), dpi = 10)

  ax = fig.add_subplot(1,1,1)

  x_posi, y_posi, y_posi2 = 320, 25, 25

  for c in list_color:

   if list_color.index(c) <= 5:

   y_posi += 125

   rect = patches.Rectangle((x_posi, y_posi), 290, 115, facecolor = c)

   ax.add_patch(rect)

   ax.text(x = x_posi+360, y = y_posi+80, s = c, fontdict={fontsize: 150})

   else:

   y_posi2 += 125

   rect = patches.Rectangle((x_posi + 800, y_posi2), 290, 115, facecolor = c)

   ax.add_artist(rect)

   ax.text(x = x_posi+1160, y = y_posi2+80, s = c, fontdict={fontsize: 150})

  ax.axis(off)

  plt.imshow(bg)

  plt.tight_layout()

  

  

  

三、完整代码

  我为了省事,resize路径被写在程序了,请注意根据自己的情况修改。

  

import numpy as np

  import pandas as pd

  import matplotlib.pyplot as plt

  import matplotlib.patches as patches

  import matplotlib.image as mpimg

  from PIL import Image

  from matplotlib.offsetbox import OffsetImage, AnnotationBbox

  import cv2

  import extcolors

  from colormap import rgb2hex

  def color_to_df(input):

   colors_pre_list = str(input).replace(([(, ).split(, ()[0:-1]

   df_rgb = [i.split(), )[0] + ) for i in colors_pre_list]

   df_percent = [i.split(), )[1].replace(), ) for i in colors_pre_list]

   # convert RGB to HEX code

   df_color_up = [rgb2hex(int(i.split(", ")[0].replace("(", "")),

   int(i.split(", ")[1]),

   int(i.split(", ")[2].replace(")", ""))) for i in df_rgb]

   df = pd.DataFrame(zip(df_color_up, df_percent), columns=[c_code, occurence])

   return df

  def exact_color(input_image, resize, tolerance, zoom):

   # background

   bg = bg.png

   fig, ax = plt.subplots(figsize=(192, 108), dpi=10)

   fig.set_facecolor(white)

   plt.savefig(bg)

   plt.close(fig)

   # resize

   output_width = resize

   img = Image.open(input_image)

   if img.size[0] >= resize:

   wpercent = (output_width / float(img.size[0]))

   hsize = int((float(img.size[1]) * float(wpercent)))

   img = img.resize((output_width, hsize), Image.ANTIALIAS)

   resize_name = C:/Users/zyh/Desktop/resize_456.jpg

   img.save(resize_name)

   else:

   resize_name = input_image

   # crate dataframe

   img_url = resize_name

   colors_x = extcolors.extract_from_path(img_url, tolerance=tolerance, limit=13)

   df_color = color_to_df(colors_x)

   # annotate text

   list_color = list(df_color[c_code])

   list_precent = [int(i) for i in list(df_color[occurence])]

   text_c = [c + + str(round(p * 100 / sum(list_precent), 1)) + % for c, p in zip(list_color, list_precent)]

   fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(160, 120), dpi=10)

   # donut plot

   wedges, text = ax1.pie(list_precent,

   labels=text_c,

   labeldistance=1.05,

   colors=list_color,

   textprops={fontsize: 150, color: black})

   plt.setp(wedges, width=0.3)

   # add image in the center of donut plot

   img = mpimg.imread(resize_name)

   imagebox = OffsetImage(img, zoom=zoom)

   ab = AnnotationBbox(imagebox, (0, 0))

   ax1.add_artist(ab)

   # color palette

   x_posi, y_posi, y_posi2 = 160, -170, -170

   for c in list_color:

   if list_color.index(c) <= 5:

   y_posi += 180

   rect = patches.Rectangle((x_posi, y_posi), 360, 160, facecolor=c)

   ax2.add_patch(rect)

   ax2.text(x=x_posi + 400, y=y_posi + 100, s=c, fontdict={fontsize: 190})

   else:

   y_posi2 += 180

   rect = patches.Rectangle((x_posi + 1000, y_posi2), 360, 160, facecolor=c)

   ax2.add_artist(rect)

   ax2.text(x=x_posi + 1400, y=y_posi2 + 100, s=c, fontdict={fontsize: 190})

   fig.set_facecolor(white)

   ax2.axis(off)

   bg = plt.imread(bg.png)

   plt.imshow(bg)

   plt.tight_layout()

   return plt.show()

  exact_color(C:/Users/zyh/Desktop/456.jpg, 900, 12, 2.5)

  运行结果如下

  

  到此这篇关于使用Python进行图像颜色量化的文章就介绍到这了,更多相关Python图像颜色量化内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: