Я выполнял простую задачу обработки изображений, которую я прототипировал на Matlab, а затем сделал порт для Java. После выполнения задачи на Java я заметил разные результаты. Это проблема конкретной платформы?
Задача, которую я делал до сих пор, заключается в получении зеленого канала изображения, вычислении процента числа пикселей со значениями определенного диапазона и вычислении среднего арифметического этого канала. Отображаются код и результаты:
Matlab
a = imread('large.jpg');
g = a(:,:,2);
[x,y] = size(b);
count = 0;
for i=1:x
for j=1:y
if g(i,j) < 90 & g(i,j) > 30
count = count + 1;
%Mistake part for arithmetic mean. Thanks to james_alvarez
g(i,j) = 255;
end
end
end
count
(count/(3000*2400))*100
mean2(g)
----------
1698469
23.5898
165.9823
Ява
BufferedImage img = ImageIO.read(Function.class.getResource("large.jpg"));
int gCount = 0;
int meanCount = 0;
int w = img.getWidth();
int h = img.getHeight();
for(int i = 0 ; i < w ; i++){
for(int j = 0 ; j< h ; j++){
Color c = new Color(img.getRGB(i,j));
int g = c.getGreen();
meanCount += g;
if(g < 90 && g > 30)
gCount++;
}
}
System.out.println(gCount);
System.out.println((gCount/(3000.0*2400.0))*100.0);
System.out.println(meanCount/(3000*2400));
----------
1706642
23.70336111111111
121
Почему они дают значительно разные результаты?
В коде Matlab вы также добавляете строку:
g(i,j) = 255;
Какая может быть вероятность того, что среднее значение "g" выше в версии matlab. В противном случае ваши индексы подходят для подсчета? например, в matlab вы используете размер (b), вместо того, чтобы получать ширину/высоту непосредственно из изображения.