找到jpeg暗像素数的“最简单”方法是什么?

时间:2014-11-08 18:45:46

标签: c++ image image-processing jpeg

我是第一年的工科学生,我正在完成一个学期末项目。由于截止日期紧迫,我想避免通过图像处理库进行搜索。我们(我的小伙伴)需要找到最简单的可实现方法,以从图像中获取暗像素数的整数。我已经阅读了很多关于图像处理的帖子,但它们比我们需要的要复杂得多。是否有捷径可寻?重要的是它很容易,因为这只是我们项目的一小部分,并且不会有太多时间致力于此。

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

在旁注中,我们的报告中会引用任何特殊帮助(仅提及您想要引用的名称,并且您将在历史中记录下来)。它也会让我们有时间睡觉。睡觉是给工程师学生什么蛋糕是胖孩子。

4 个答案:

答案 0 :(得分:1)

这有两个阶段:

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

第一阶段并不太难 - 您可以使用预先存在的库,例如DevILFreeImage,也可以编写自己的库 - this和{{3应该足以让你开始。

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

typedef struct
{

  int w;
  int h;
  unsigned char *data;

} image_s;

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

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

}

答案 1 :(得分: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,这可能不是很快,但你说&#34; easy&#34;不是&#34;快&#34;。

答案 2 :(得分:0)

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

使用RGB可能会很痛苦,但这一切都取决于你对黑暗&#39;像素。

答案 3 :(得分:0)

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

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