Как рассчитать площадь на изображении - PullRequest
0 голосов
/ 28 мая 2020

Отредактировано: исходное изображение прикреплено как 2 , я хочу найти область руки, на которой есть блестки. Я обработал изображение, чтобы найти мерцание, как указано в 1 .

Теперь мне нужно найти черные части изображения. Я использую OpenCV в Android Studio.

Код:

int[] allpixels = new int[bitmap_original.getHeight() * bitmap_original.getWidth()];
outputBitmap.getPixels(allpixels, 0, outputBitmap.getWidth(), 0, 0, outputBitmap.getWidth(), outputBitmap.getHeight());
double value = 0;
for (int i = 0; i < allpixels.length; i++) {
    value++; 
    //minus the white in the image
    if (allpixels[i] == Color.WHITE) {
        value--;
    }
}

Изображения: Output image

Original input image

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Изменить: Ну, ваше новое изменение полностью меняет вопрос. В этом случае кажется, что неточность ваших результатов должна быть устранена путем улучшения способа обнаружения блеска, а не способа вычисления площади. Как только обнаружение будет улучшено, вы можете просто вычислить площадь, как предлагает Юнус Темурленк в своем ответе.

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

#Octave code
I=imread(your_image);

N=20;
se=strel("square",20);
J=I;
for i=1:N
    J=imopen(J,se);
end

imagesc(J);

enter image description here

Да, это можно было бы сделать намного лучше, но даже в этом случае подсчет ненулевых пикселей на этом изображении, вероятно, даст вам лучшее приближение площади, чем подсчет их в исходном.

0 голосов
/ 28 мая 2020

Поскольку вопрос имеет тег OpenCV, вот несколько указателей в этом направлении:

  1. Ознакомьтесь с OpenCV Android руководством по настройке (в настоящее время существует проблема с HTTPS с сайт: Advanced> Proceed должен сработать)
  2. После применения морфологического открытого фильтра (как правильно советует A sh) с помощью dilate() вы можете findContours() (только внешний, упрощенный - вот что вам нужно)
  3. Затем вы можете легко получить площадь первого контура с помощью contourArea (), boundingRect() (или minAreaRect() для ориентированной ограничивающей рамки) среди многих других показателей, полученных из контуров

Если вам просто нужно подсчитать количество пикселей, вы можете инвертировать изображение используйте countNonZero()

...