2 回答
TA贡献1719条经验 获得超6个赞
我决定使用列表而不是字典。我没有看到任何特别的优势。我还删除了两者int()
:
percent = int(count/total * 100)
和
if percent > 0:
因为如果您的图像具有多种色调,则该条件永远不会通过。
完整代码如下:
import pandas as pd
from PIL import Image
from collections import Counter
img = Image.open("Original 2.JPG")
size = w, h = img.size
data = img.load()
colors = []
for x in range(w):
for y in range(h):
color = data[x, y]
hex_color = '#'+''.join([hex(c)[2:].rjust(2, '0') for c in color])
colors.append(hex_color)
total = w * h
color_hex = []
color_count = []
color_percent =[]
df = pd.DataFrame()
for color, count in Counter(colors).items():
percent = count/total * 100 # Do not make it int. Majority of colors are < 1%, unless you want >= 1%
color_hex.append(color)
color_count.append(count)
color_percent.append(percent)
df['color'] = color_hex
df['count'] = color_count
df['percent'] = color_percent
df.to_excel(r'C:\Users\Ahmed\Desktop\Project\export_dataframe.xlsx',
index=False, header=True)
TA贡献1868条经验 获得超4个赞
for 循环中的代码确实没有意义。
int对can return 的调用0将导致该 if 语句为 false。
下面的所有内容(包括写入 Excel 文件)都会针对每种颜色执行。据推测,这是一个缩进错误。
df['colors'] = final[0::3] <--------------Error returning from here
final是一个dict. 您需要使用 3 个键之一来访问它。例如:final['colors'],它将返回像素颜色的整个列表,包括重复项。
你想要的可以通过这段代码实现:
import pandas as pd
from PIL import Image
from collections import Counter
import prettytable
img = Image.open("Original 2.JPG")
size = w, h = img.size
data = img.load()
colors = []
for x in range(w):
for y in range(h):
color = data[x, y]
hex_color = '#'+''.join([hex(c)[2:].rjust(2, '0') for c in color])
colors.append(hex_color)
#pt = prettytable.PrettyTable(['Color', 'Count', 'Percentage'])
total = w * h
colors, counts = zip(*Counter(colors).items())
percentages = tuple(count / total for count in counts)
df = pd.DataFrame()
df['colors'] = colors
df['count'] = counts
df['percent'] = percentages
df.to_excel(r'C:\Users\Ahmed\Desktop\Project\export_dataframe.xlsx',
index=False, header=True)
2 个关键行是:
colors, counts = zip(*Counter(colors).items())
percentages = tuple(count / total for count in counts)
第一行创建了 2 个tuples具有所有独特颜色及其计数的颜色。元组基本上是不可变的list。zip与*解包运算符结合用于将键和值Counter(colors).items()对转换为它们自己的单独元组。
第二行从生成器表达式创建一个元组,该元组为我们提供所有颜色的百分比。
colors、counts、 和percentages全部对齐,因此相同的索引表示相同的颜色。
添加回答
举报