Какой метод подсчета пикселей в OpenCV более точен для цветных изображений? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть образец изображения:

Source image

, и я использую различные методы порогового значения для подсчета количества пикселей.

Первый метод - это простой порогпоскольку на исходном изображении у меня есть только один цветной объект на белом фоне.

    Mat image = imread("/$image_path", IMREAD_GRAYSCALE);
    Mat binary_image;
    threshold(image, binary_image, 120, 255, THRESH_BINARY);
    int TotalNumberOfPixels = binary_image.rows * binary_image.cols;
    int PixelCount = TotalNumberOfPixels - cv::countNonZero(binary_image);
    return PixelCount;

Второй метод предполагает, что у меня есть изображение с несколькими цветными объектами (то есть с несколькими цветными метками), поэтому мне нужно отфильтроватьи применить красную маску.Я сделал это через:

Mat image2 = imread("/$image_path", IMREAD_COLOR);
Mat blurred, edge;
Mat bgrInv = ~image2;
Mat hsvIm;
Mat maskRed;    

cvtColor(bgrInv, hsvIm, COLOR_BGR2HSV);

inRange(hsvIm, Scalar(80, 70, 239), Scalar(100, 255, 255), maskRed);
imshow("Mask", maskRed);

//blur(maskRed, blurred, Size(3, 3));
//Canny(blurred, edge, 75, 200, 3);

cout << "Pixel Count: " << countNonZero(maskRed)<< endl;

Вывод для обоих методов:

Method 1: 406
Method 2: 155

Я буду работать с цветным изображением, поэтому сначала я использовал второй метод.Но я не знаю, будет ли он «точным» или правильным.

Здесь - это образец шаблона, над которым я работаю.Это в основном шаблон типа обследования с небольшими цветными блоками.С красными кружками в качестве заполнителей для облегчения предварительной / последующей обработки.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я думаю, что все методы не точны, если ваше изображение размыто (например, в формате JPEG).Но давайте предположим, что все ясно.

Для подсчета пикселей цветных объектов мы можем подсчитать все colored pixels или подсчитать все RED pixels.

(1) Найти области colored в HSV: Как обнаружить цветные пятна на изображении с помощью OpenCV?

# count colored pixels in S(HSV)
def countColored(img):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    h,s,v = cv2.split(hsv)
    num = np.sum(s>20)
    return num

(2) Найти области Red: Как найти КРАСНЫЕ цветовые области с помощью OpenCV?

def countRed(img):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    h,s,v = cv2.split(hsv)
    mask1 = cv2.inRange(hsv, (0,50,20), (5,255,255))
    mask2 = cv2.inRange(hsv, (175,50,20), (180,255,255))
    mask = cv2.bitwise_or(mask1, mask2 )
    num = cv2.countNonZero(mask)
    return num

#!/usr/bin/python3
# 2019/02/28
import cv2
import numpy as np

def cvshow(img):
    cv2.imshow("OpenCV", img)
    cv2.waitKey();cv2.destroyAllWindows()

def countColored(img):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    h,s,v = cv2.split(hsv)
    num = np.sum(s>20)
    return num

def countRed(img):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    h,s,v = cv2.split(hsv)
    mask1 = cv2.inRange(hsv, (0,50,20), (5,255,255))
    mask2 = cv2.inRange(hsv, (175,50,20), (180,255,255))
    mask = cv2.bitwise_or(mask1, mask2 )
    num = cv2.countNonZero(mask)
    return num

if __name__ == "__main__":
    fpath = "fQipc.jpg"
    img = cv2.imread(fpath)
    num1 = countColored(img)
    num2 = countRed(img)
    print(num1, num2)
    # 643, 555
0 голосов
/ 28 февраля 2019

Давайте посмотрим на результаты ваших двух методов.

Это binary_image из метода № 1:

enter image description here

Вы считаете - громоздко (это правильный английский?) - черные пиксели, что соответствует вашей задаче подсчитать красные пиксели.(Кстати, инвертируйте threshold и просто посчитайте белые пиксели.)

Это edge из метода # 2:

enter image description here

Вы считаете белые пиксели, но, как видите, это только контур исходного красного объекта.И это НЕ соответствует вашей первоначальной задаче.

Итак, учитывая оба метода, как они есть, первый является более «точным» в данный момент и для данного примера.Тем не менее, вы упомянули объекты разных цветов, поэтому метод № 2 должен быть переработан для подсчета правильных пикселей.

Не могли бы вы привести примеры изображений с несколькими объектами разного цвета?

Также,Я редактировал твой вопрос.(Редактирование еще не пересмотрено.) Часть загрузки изображения важна, поскольку, я думаю, в методе № 1 вы использовали imread(..., IMREAD_GRAYSCALE) и imread(..., IMREAD_COLOR) в методе № 2.

...