【问题标题】:When do I know a new significant color change is reached between pixels?我什么时候知道像素之间出现了新的显着颜色变化?
【发布时间】:2016-08-10 23:26:37
【问题描述】:

我正在开发一款 Android 应用,并且想定位手机摄像头拍摄的图像的边缘。我认为定位这些边缘的最佳选择是寻找两个像素之间的像素,这两个像素是两种重要的颜色。例如绿色阴影和黑色阴影。

我怎么会遇到这个像素?是否有一系列与各种颜色和色调相关的数字? IE。 100-200 是红色,200-300 是蓝色,等等?

【问题讨论】:

  • 您首先需要知道图像的格式,即JPGPNGBMP 等(有很多不同的图像文件格式)。然后,您需要解压缩或解析该格式的二进制数据以检索工作像素数据。然后,您需要遍历该文件中的所有像素,以检查在其他两个像素之间的一个像素是否表现出显着颜色的变化(这将是您定义的某个阈值)。这不涉及不同的颜色格式,例如RGBARGBRGBAICMY等。
  • 我不熟悉Android相机或它的API,但可能会发现图像没有直接保存到文件中,而是可以从流中读取。在这种情况下,您可能不必解析图像文件,而是可以访问原始像素数据。
  • 不确定我是否理解您真正想要实现的目标,但仅供参考:大多数边缘检测算法检查像素的邻域,而不仅仅是单个像素。 en.wikipedia.org/wiki/Edge_detection

标签: java android computer-vision


【解决方案1】:

首先,您可以使用android.graphics.Bitmap。 如果您的图像来自设备相机或设备媒体,您可以这样做:

Bitmap bitmap = MediaStore.Images.Media.getBitmap(activity.getContentResolver(), uri);

您可能还需要图像的缩小版本,以便位图中的总像素更少;这将对性能有很大帮助:

bitmap = createScaledBitmap(bitmap, bitmap.getWidth()/scaleFactor, bitmap.getHeight()/scaleFactor, false);

其次,要获取像素,您可以这样做:

int [] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());

第三,要评估红色、蓝色、绿色、黑色、白色等,请使用以下约定:

black = 0x000000
red   = 0xff0000
green = 0x00ff00
blue  = 0x0000ff
white = 0xffffff

这取决于您的确切需求,您希望使用什么范围来限定特定颜色。我建议通过以下方式计算重大变化:

final static int SIGNIFICANT_CHANGE_AMOUNT = 0xff;

int pixelA = pixels[i];
int pixelB = pixels[i+1];
boolean sigChange = false;
int changeInRed = Math.abs(((pixelA & 0xff0000) >> 16) - ((pixelB & 0xff0000) >> 16));
int changeInGreen = Math.abs(((pixelA & 0x00ff00) >> 8) - ((pixelB & 0x00ff00) >> 8));
int changeInBlue = Math.abs(((pixelA & 0x0000ff) >> 0) - ((pixelB & 0x0000ff) >> 0));
int overallChange = changeInRed + changeInGreen + changeInBlue;
if (overallChange > SIGNIFCANT_CHANGE_AMOUNT) {
    sigChange = true;
}

你仍然需要编写一个算法来检测一个区域,但我认为如果你关注Flood Fill Algorithm wiki,它会有很大帮助。我使用了基于队列的实现,因为递归的实现并不可行。

还请注意,当您从已用作 android 视图的位图中获取像素时,您将需要屏蔽透明度字节...您可以看到 post

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多