在您发布的示例图像中,可以通过给定的直方图来近似计算文本的平均颜色。
在一般情况下,需要将文本与背景分离,并仅收集文本像素的直方图。
在您发布的图像中,我们可以假设背景是白色(RGB颜色约为[255, 255, 255]),而文本是暗色的(所有文本的RGB颜色分量值都很低)。
您可以使用以下步骤:
- 收集红、绿和蓝色通道的直方图。
- 从直方图中删除所有高值(将直方图值设置为零)。假设高值来自背景像素。
- 计算直方图的总和。总和表示原始图像中的像素数。
- 根据直方图计算原始图像中的像素总数。例如:如果`h[100]=10`,则图像中具有值为100的像素数为10。10个像素的总和为100*10。原始图像中像素的总和为:`h[0]*0 + h[1]*1 + h[2]*2...`
- 计算平均值 - 通过将总和除以计数来计算平均值。
以下是代码:
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('img.png')
h_red = cv2.calcHist([img], [2], None, [256], [0,256])
h_green = cv2.calcHist([img], [1], None, [256], [0,256])
h_blue = cv2.calcHist([img], [0], None, [256], [0,256])
h_red[230:] = 0
h_green[230:] = 0
h_blue[230:] = 0
count_red = h_red.sum()
count_green = h_green.sum()
count_blue = h_blue.sum()
sum_red = np.sum(h_red * np.c_[0:256])
sum_green = np.sum(h_green * np.c_[0:256])
sum_blue = np.sum(h_blue * np.c_[0:256])
avg_red = sum_red / count_red
avg_green = sum_green / count_green
avg_blue = sum_blue / count_blue
print('Text RGB average is about: {}, {}, {}'.format(avg_red, avg_green, avg_blue))
注意:
我故意让代码简单,没有使用for循环。
我认为你最好修改代码,使用for循环。