Arrays 如何准确(但自适应)检测一行中的暗像素组?

Arrays 如何准确(但自适应)检测一行中的暗像素组?,arrays,image,image-processing,pixels,difference,Arrays,Image,Image Processing,Pixels,Difference,想象一下,我需要编写一个程序来获取图像并查找包含暗像素组的像素行。下面是一个示例图像 请记住,这个例子是一个理想的场景;我的目标是能够使用标准的手机摄像头或网络摄像头来实现这一点,其照明/对比度/焦距会有所不同。图像并不总是完全二值化的 每一行都是包含RGBA数据的较小像素阵列的数组。像素的格式为:[r,g,b,a] 下面是一行像素的示例: [161160138255],[160162134255],[160162134255],[152163137255],[152163137255],[15

想象一下,我需要编写一个程序来获取图像并查找包含暗像素组的像素行。下面是一个示例图像

请记住,这个例子是一个理想的场景;我的目标是能够使用标准的手机摄像头或网络摄像头来实现这一点,其照明/对比度/焦距会有所不同。图像并不总是完全二值化的

每一行都是包含RGBA数据的较小像素阵列的数组。像素的格式为:[r,g,b,a]

下面是一行像素的示例:

[161160138255],[160162134255],[160162134255],[152163137255],[152163137255],[152163137255],[152163137255]]

请注意,一个典型的行数组要比这个数组大得多,长度最多为1024

我想做的是能够收集组成行中暗组的像素组

因此,最后我需要类似以下伪代码的东西:

print groups

// [[pixel, pixel, pixel, pixel], [pixel, pixel, pixel, pixel], [pixel, pixel, pixel, pixel], [pixel, pixel, pixel, pixel], [pixel, pixel, pixel, pixel]]

groups.length

// 5
问题是,虽然只查找亮度低于阈值的像素很容易,但较差的照明可能意味着其他非黑色像素可能低于任意阈值。同时,我不能总是寻找绝对值为0的像素,因为实际上,不是每个视觉黑色像素的值都为0

我想通过迭代一行并将每个像素与之前的像素进行比较来解决这个问题;如果它与上一个相差超过80%,那么它将被视为对比像素,因此是一组的开始。下一次出现80%或以上的差异将意味着像素组的结束。这将是伟大的,因为它可以检测不同颜色的行,甚至是我的示例的反转版本

然而,这个想法中的一个巨大缺陷是,如果程序遇到一个值为0的像素,而前一个值为250,那么就开始了一个像素组,但随后的像素值为2,从技术上讲,这将是一个200%的差异,并将被视为一个像素组的结束,这是错误的

在技术上,任意阈值仍然有效,但适应性不强。当我遍历一行时收集阈值的平均值会有所帮助,但它仍然不是完美的。我觉得我寻找像素之间剧烈变化的想法更具可扩展性,但如果没有好的解决方案,我不确定是否应该继续沿着这条路走下去。有没有其他从图像中获取此类数据的技术


示例代码在任何语言中都是受欢迎的,尽管我更喜欢Ruby、JavaScript、CoffeeScript或Python。

当您谈论寻找低强度像素时,我假设您实际上是在HSI颜色空间中工作。您还可以尝试在YCbCr颜色空间中工作,查看Cb和Cr值。Cb-128*Cb-128+Cr-128*Cr-128<一些用于识别暗像素的值。此外,一些方法将暗像素阈值计算为某个因子乘以平均图像强度,或者更自适应地计算为某个因子乘以移动窗口中的平均强度。您仍然需要至少进行第二次测试,以确保移动窗口中的平均强度高于某个值。我正在将像素转换为HSL,尽管我不做HS部分,因为它们无关紧要,而且会浪费计算时间。我不清楚如何计算Cb/Cr比计算L更好。我喜欢窗口的想法,尽管我认为它会影响性能。我必须尝试一下。使用YCbCr的方法在计算上很昂贵,而且可能不是你想要的。不过,我想知道你对HSI的使用情况。你可能还想看看饱和度?如果你担心因为光线不好而识别出低强度的像素,那么饱和度可能会给你另一个线索。