【问题标题】:What is the "easiest" way to find the number of dark pixels of a jpeg? [closed]找到 jpeg 的暗像素数量的“最简单”方法是什么? [关闭]
【发布时间】:2015-01-05 09:30:38
【问题描述】:

我是一年级工程专业的学生,​​我正在做一个学期末的项目。由于时间紧迫,我想避免翻遍图像处理库。我们(我的小组伙伴)需要找到最简单的可实施方法来从图像中获取暗像素数量的整数。我已经阅读了许多其他有关图像处理的帖子,但它们比我们需要的要复杂得多。是否有捷径可寻?重要的是它很简单,因为这只是我们项目的一小部分,不能花太多时间在这上面。

至于语言,我更喜欢使用 C++。

附带说明,我们的报告中会引用任何特殊的帮助(只需提及您想被引用的名字,您就会载入史册)。它也可以让我们有时间睡觉。睡眠对于工科学生来说就像蛋糕对于胖孩子一样。

【问题讨论】:

  • 对于图像中的每个像素,如果像素为暗 darkpixels++
  • 唯一的方法是: 1. 获取像素(标准图像读取)。 2. 根据您的标准将它们分类为深色或非深色。 3. 返回分类为“暗”的像素数。
  • @πάνταῥεῖ - 这只是一个轻微的歧义。显然是某种阈值。
  • @ddriver 回答,还是闭嘴?
  • @πάνταῥεῖ - 完成,即使在保持“暗像素”相对模糊的情况下也可以回答它

标签: c++ image image-processing jpeg


【解决方案1】:

这是在 Qt 中完成的(不是图像处理,而是应用程序库)

#include <QImage>
#include <QColor>

uint countDarkPixels(QString filename, quint8 threshold) {
    QImage img(filename);
    uint darkPixels = 0;
    for (int x = 0; x < img.width(); ++x) {
        for (int y = 0; y < img.height(); ++y) {
            QColor color(img.pixel(x, y));
            if (color.toHsl().lightness() < threshold) darkPixels++;
        }
    }
   return darkPixels;
}

也适用于 JPG 以外的其他格式。它使用转换为 HSL 的方式可能不是很快,但您说的是“简单”而不是“快速”。

【讨论】:

  • 我确实这么说过。我将研究 QImage 和 QColor ,因为这似乎很容易实现;谢谢你的时间。有没有我可以用来引用帮助的名字?
  • 别打扰,我不在乎。但是您可能想要切换 x 和 y 迭代顺序,我的示例是为了可读而完成的,但它对 CPU 缓存不是很友好,因为它会一次迭代向下列,迭代像素行可能会快很多。
  • 这个软件很棒,它可以做任何事情。它非常适合我们的机器人项目!!!!
  • @Klik - Qt 是一个大框架,当然可以做很多事情,尽管远非一切。而且它并不真正适合机器人,它是一个应用程序框架,但它的功能非常好,例如你可以在完全不使用 C++ 标准库的情况下用 C++ 编写专业软件,将其替换为 Qt 核心类。跨度>
【解决方案2】:

这有两个阶段:

  • 从文件加载图像。
  • 确定该图像中有多少像素是“暗”的。

第一阶段并不太难 - 您可以使用预先存在的库,例如 DevILFreeImage,或者编写自己的库 - thisthis 应该足以满足您的需求开始了。

一旦您以某种方式将图像加载到程序中,您将需要遍历像素数据并计算“暗”像素的数量。假设您有一个如下所示的图像结构:

typedef struct
{

  int w;
  int h;
  unsigned char *data;

} image_s;

为简单起见,我们做以下假设:

  • 图像以 24 位 RGB 格式存储,因此每个像素都表示为三个无符号字节,如下所示:RGBRGBRGB
  • “暗”像素是(R+G+B)/3 &lt; 10

鉴于上述情况,您只需像这样遍历图像结构中的每个像素:

int count_dark_pixels(image_s *img)
{

  int dark_pixels, i;

  for (dark_pixels = 0, i = 0; i < img->w * img->h; ++i)
  {
    int r = img->data[(i*3)+0];
    int g = img->data[(i*3)+1];
    int b = img->data[(i*3)+2];
    if ((r+g+b)/3 < 10) { ++dark_pixels; }
  }

  return dark_pixels;

}

【讨论】:

  • 嘿Gobusto,非常感谢代码。有没有我可以在我的报告中引用的名字?这很有帮助,而且绝对是朝着正确方向迈出的一大步。
  • RGB 并不是最好的色彩空间
  • @James 为什么不呢? (严肃的问题 - 我对 RGB 以外的任何东西都不太熟悉。)从你自己的回答中,我猜这是因为 YUV 有一个明确的“亮度”通道,使暗像素更容易检测到?
  • @GoBusto - 它在考虑人类感知的情况下对彩色图像或视频进行编码,从而减少色度分量的带宽,从而通常能够比使用人类感知更有效地掩盖传输错误或压缩伪影来自维基百科的“直接”RGB 表示
【解决方案3】:

解压jpeg,得到Y通道像素数据(这些值是每个像素的亮度),计算其中的暗像素。我认为您不需要 U 和 V 通道,它们用于重建颜色信息。

使用 RGB 可能会很痛苦,但这完全取决于您所说的“暗”像素是什么意思。

【讨论】:

  • 老实说,我不太了解色彩理论。我正在使用网络摄像头拍摄图像,我需要将明亮的背景与物体分开。我需要从顶视图中找到对象的区域以对其进行分类。我不知道有一个光度通道。这是一个很好的提示,有什么地方可以指点我吗?
【解决方案4】:

JPEG 图像通常使用 YCbCr 颜色空间进行编码。这三个成分不是红、绿、蓝,而是暗、蓝和红。 Y 分量是彩色图像的黑白版本。

然后,您可以通过检查图像 Y 分量的值来确定任何点的暗度。您可以设置一些阈值来确定暗像素。

【讨论】:

    猜你喜欢
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多