【问题标题】:color percentage in image python opencv using histogram使用直方图的图像python opencv中的颜色百分比
【发布时间】:2017-08-27 07:55:30
【问题描述】:

我是 python 和图像处理的初学者。我想使用直方图函数从图像中找到棕色的百分比。

我做了直方图功能,但我不知道如何找到图像中棕色的百分比。

这是我的python代码

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('C:\Users\MainUser\Desktop\histogram\dates.jpg', -1)
cv2.imshow('GoldenGate',img)

color = ('b','g','r')
for channel,col in enumerate(color):
    histr = cv2.calcHist([img],[channel],None,[256],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])
plt.title('Histogram for color scale picture')
plt.show()

while True:
    k = cv2.waitKey(0) & 0xFF     
    if k == 27: break             # ESC key to exit 
cv2.destroyAllWindows()

我使用的图片

我有这个代码输出

【问题讨论】:

  • 你想严格使用直方图来完成这个吗?
  • 从技术上讲,我在回答中使用了直方图方法,方法是对颜色通道进行积分并获取与所需颜色相对应的积分子集。尽管如此,我同意你的观点,这个问题在这方面是可以解释的。猜猜作者是时候回应了。

标签: python opencv image-processing histogram


【解决方案1】:
import numpy as np
import cv2

img = cv2.imread('J9MbW.jpg')

brown = [145, 80, 40]  # RGB
diff = 20
boundaries = [([brown[2]-diff, brown[1]-diff, brown[0]-diff],
               [brown[2]+diff, brown[1]+diff, brown[0]+diff])]
# in order BGR as opencv represents images as numpy arrays in reverse order

for (lower, upper) in boundaries:
    lower = np.array(lower, dtype=np.uint8)
    upper = np.array(upper, dtype=np.uint8)
    mask = cv2.inRange(img, lower, upper)
    output = cv2.bitwise_and(img, img, mask=mask)

    ratio_brown = cv2.countNonZero(mask)/(img.size/3)
    print('brown pixel percentage:', np.round(ratio_brown*100, 2))

    cv2.imshow("images", np.hstack([img, output]))
    cv2.waitKey(0)

这应该适合你。但是,请注意,它高度依赖于您的 RGB 棕色值以及所需的容差 (diff)。

如果您对上述代码的详细信息还有其他疑问,请随时提问。

【讨论】:

  • 太棒了,非常感谢它对我有用。但百分比总是0?不管是什么图片
  • 你是对的,百分比有问题 - 对于彩色图像 img.size 显然是像素数乘以通道数 - 所以我在答案中添加了 '/3' 并测试了半棕色的测试图像的百分比。对于上面提供的图像,代码产生了 9.78% 的“棕色”像素。尽管如此,请记住,结果仍然很大程度上取决于您对“棕色”的定义和您的容差 (diff)。此外,如果您更愿意检查“较暗”与“较亮”区域,可以为下边界和上边界设置单独的容差。
  • 不幸的是仍然出现 0 百分比 :(
  • 你使用什么版本的opencv、numpy和Python?
  • python 2.7.3 - numpy 1.8 - opencv 3.1
【解决方案2】:

我需要相同的结果,所以我使用了你的代码并让它计算百分比。

import cv2
import numpy as np
from matplotlib import pyplot as plt
import operator

img = cv2.imread('azul200.png', -1)
cv2.imshow('Imagem:',img)

color = ('b','g','r')
qtdBlue = 0
qtdGreen = 0
qtdRed = 0
totalPixels = 0

for channel,col in enumerate(color):
    histr = cv2.calcHist([img],[channel],None,[256],[1,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])
    totalPixels+=sum(histr)
    print histr
    if channel==0:
        qtdBlue = sum(histr)
    elif channel==1:
        qtdGreen = sum(histr)
    elif channel==2:
        qtdRed = sum(histr)

qtdBlue = (qtdBlue/totalPixels)*100
qtdGreen = (qtdGreen/totalPixels)*100
qtdRed = (qtdRed/totalPixels)*100

qtdBlue = filter(operator.isNumberType, qtdBlue)
qtdGreen = filter(operator.isNumberType, qtdGreen)
qtdRed = filter(operator.isNumberType, qtdRed)

plt.title("Red: "+str(qtdRed)+"%; Green: "+str(qtdGreen)+"%; Blue: "+str(qtdBlue)+"%")
plt.show()

希望对我有帮助,对我很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2013-09-16
    相关资源
    最近更新 更多