如何在固定尺寸的图像中找到主要物体的颜色

2024-09-24 22:18:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是找出一帧/图像中主要物体的颜色。在我的例子中,图像总是同一类型的。例如森林中的新闻记者(人类)或畜牧场中的新闻记者。新闻记者的职位也很重要一样。什么找出主要物体的主要颜色的简单方法(新闻记者)

任何帮助都是欢迎。谢谢你知道吗

添加编辑代码

import cv2
from collections import namedtuple
from math import sqrt
import random
import webcolors


try:
 import Image
except ImportError:
 from PIL import Image

Point = namedtuple('Point', ('coords', 'n', 'ct'))
Cluster = namedtuple('Cluster', ('points', 'center', 'n'))

def get_points(img):
 points = []
 w, h = img.size
 for count, color in img.getcolors(w * h):
    points.append(Point(color, 3, count))
 return points

 rtoh = lambda rgb: '#%s' % ''.join(('%02x' % p for p in rgb))

def colorz(filename, n=3):
 img = Image.open(filename)
 img.thumbnail((200, 200))
 w, h = img.size

 points = get_points(img)
 clusters = kmeans(points, n, 1)
 rgbs = [map(int, c.center.coords) for c in clusters]
 return map(rtoh, rgbs)

def euclidean(p1, p2):
  return sqrt(sum([
  (p1.coords[i] - p2.coords[i]) ** 2 for i in range(p1.n)
 ]))

 def calculate_center(points, n):
  vals = [0.0 for i in range(n)]
  plen = 0
  for p in points:
    plen += p.ct
    for i in range(n):
        vals[i] += (p.coords[i] * p.ct)
   return Point([(v / plen) for v in vals], n, 1)

def kmeans(points, k, min_diff):
 clusters = [Cluster([p], p, p.n) for p in random.sample(points, k)]

 while 1:
   plists = [[] for i in range(k)]

   for p in points:
        smallest_distance = float('Inf')
        for i in range(k):
            distance = euclidean(p, clusters[i].center)
            if distance < smallest_distance:
                smallest_distance = distance
                idx = i
        plists[idx].append(p)

    diff = 0
    for i in range(k):
        old = clusters[i]
        center = calculate_center(plists[i], old.n)
        new = Cluster(plists[i], center, old.n)
        clusters[i] = new
        diff = max(diff, euclidean(old.center, new.center))

    if diff < min_diff:
        break

 return clusters

def main():

 img = cv2.imread('d:/Emmanu/project-data/b1.jpg')
 res=cv2.resize(img,(400,300))
 crop_img = res[100:200, 150:250]
 cv2.imwrite("d:/Emmanu/project-data/color-test.jpg", crop_img)
 g= colorz('d:/Emmanu/project-data/color-test.jpg',1)
 k=g[0]
 print k
 f=webcolors.hex_to_rgb(k)
 print webcolors.rgb_to_name(f, spec='css3')

if __name__ == '__main__':main()

问题是它返回的是整个图像中的主色,而不是主对象


Tags: inimportimgforreturndefdiffrange
1条回答
网友
1楼 · 发布于 2024-09-24 22:18:10

如果你把整个图像的颜色,在大多数情况下,你会得到错误的答案,因为背景是更多。如果您的图像大小是固定的,您可以确定对象的位置最简单的解决方案是在您期望的位置裁剪图像对象。在在大多数情况下,这是可行的。你知道吗

为了收割

import cv2
img = cv2.imread("'d:/Emmanu/project-data/b1.jpg'")
crop_img = img[200:400, 100:300] # Crop from x, y, w, h -> 100, 200, 300, 400
# NOTE: its img[y: y + h, x: x + w] and *not* img[x: x + w, y: y + h]
cv2.imshow("cropped", crop_img)
cv2.waitKey(0)

现在将此图像作为输入到代码。和在大多数情况下,它会给出正确的答案解决方案。在那里再简单不过了。我想这会有帮助的。你知道吗

相关问题 更多 >