简体   繁体   English

使用直方图的图像python opencv中的颜色百分比

[英]color percentage in image python opencv using histogram

I am beginner in python and image processing. 我是python和图像处理的初学者。 I want to find the percentage of brown color from an image using histogram function. 我想使用直方图函数从图像中找到棕色的百分比。

I did the histogram function but I do not know how to find the percentage of the brown color in the image. 我做了直方图功能,但我不知道如何找到图像中棕色的百分比。

this is my python code 这是我的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()

the image that I use 我使用的图像

我使用的图像

I have this output of the code 我有这个代码的输出 在此输入图像描述

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)

This should work for you. 这应该适合你。 However, note that it is highly dependent on your RGB value of brown as well as your desired tolerance ( diff ). 但请注意,它高度依赖于您的棕色RGB值以及您所需的公差( diff )。

If you have further questions on the details of the above code, feel free to ask. 如果您对上述代码的详细信息有任何疑问,请随时提出。

I was in need of the same results, so I used your code and made it calculate percentages. 我需要相同的结果,所以我使用你的代码并使它计算百分比。

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()

I hope it helps, worked great for me. 我希望它有所帮助,对我来说很有用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM