【问题标题】:How to calculate area in a image如何计算图像中的面积
【发布时间】:2020-09-15 12:49:32
【问题描述】:

编辑: 原图附上2,我想找到手上有闪光的区域。我已经处理了图像以找到1 中所附的闪光。

现在,我需要找到图像中的黑色部分。我在 Android Studio 上使用 OpenCV。

代码:

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--;
    }
}

图片:

【问题讨论】:

  • 您是否真的截取了图像而不是仅使用原始图像?另外,如果你把所有不是白色的东西都算作黑色,你真的确定图像只是黑白格式,没有像素不是白色或黑色吗?
  • 只计算图像中的黑色像素(0 值)。这有什么难的?
  • @YunusTemurlenk 我认为 OP 对近似该区域感兴趣,因此他们可能正在寻找填补“漏洞”的方法。
  • “但它似乎没有进行准确的计算。”你是如何定义什么是“准确的计算”?
  • @MarkusKauppinen,我已经编辑了问题,请看一下。谢谢

标签: java android opencv image-processing


【解决方案1】:

编辑:您的新编辑完全改变了问题。在这种情况下,似乎应该通过改进检测闪光的方式来解决结果的不准确性,而不是计算面积的方式。一旦检测得到改善,您就可以按照 Yunus Temurlenk 在他的回答中建议的那样计算面积。

可能有更复杂的方法,但可能会产生更好结果的快速破解方法是使用mathematical morphology例如连续使用openings(免责声明:我完全没有专业知识在那个领域):

#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);

是的,它可以做得更好,但即便如此,计算此图像中的非零像素可能会比计算原始像素中的区域更接近该区域。

【讨论】:

  • 谢谢。我可以知道你用什么软件来实现这个吗?我已经更新了问题,你能看看吗?
  • @aa13579 正如 sn-p 开头的注释中所指定的,它是 octave(一个开源 matlab 克隆,或多或少),但任何体面的图像处理库都应该有类似的实现可用。
【解决方案2】:

由于该问题有一个 OpenCV 标记,因此这里有一些指向该方向的指针:

  1. 查看OpenCV Android 设置指南(目前该站点存在 HTTPS 问题:高级 > 继续应该可以解决问题)
  2. 使用 dilate() 应用形态学开放过滤器(如 Ash 正确建议的那样)后,您可以使用 findContours()(仅限外部,您所追求的是简化)
  3. 然后您可以通过contourArea ()boundingRect()(或用于定向边界框的minAreaRect())以及从轮廓派生的许多其他指标轻松获取第一个轮廓的面积

如果您只需要计算像素数,您可以使用 countNonZero() 反转图像

【讨论】:

    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    相关资源
    最近更新 更多