查找 jpeg 暗像素数的"easiest"方法是什么?

What is the "easiest" way to find the number of dark pixels of a jpeg?

本文关键字:easiest 方法 是什么 jpeg 像素数 查找      更新时间:2023-10-16

我是工程系一年级的学生,正在做期末项目。由于截止日期紧迫,我想避免在图像处理库中翻找。我们(我的小组成员)需要找到最简单的可实现方法来从图像中获得暗像素数的整数。我读过许多关于图像处理的其他帖子,但它们比我们需要的要复杂得多。有简单的方法吗?这很重要,因为这只是我们项目的一小部分,不可能有太多时间投入其中。

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

顺便说一句,我们的报告中会引用任何特殊的帮助(只要提到你想被引用的名字,你就会被载入史册)。这也会给我们睡眠的时间。睡眠对工科学生来说就像蛋糕对胖孩子来说一样。

这是在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的转换,这可能不是很快,但你说"容易"而不是"快"。

这有两个阶段:

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

第一阶段并不太难——你可以使用预先存在的库,如DevIL或FreeImage,也可以编写自己的库——这一点和这一点应该足以让你开始。

一旦你以某种方式将图像加载到程序中,你就需要遍历像素数据并计算"暗"像素的数量。假设你有一个像这样的图像结构:

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

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

工作RGB可能很痛苦,但这完全取决于你所说的"暗"像素的含义。

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

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