查找 jpeg 暗像素数的"easiest"方法是什么?
What is the "easiest" way to find the number of dark pixels of a jpeg?
我是工程系一年级的学生,正在做期末项目。由于截止日期紧迫,我想避免在图像处理库中翻找。我们(我的小组成员)需要找到最简单的可实现方法来从图像中获得暗像素数的整数。我读过许多关于图像处理的其他帖子,但它们比我们需要的要复杂得多。有简单的方法吗?这很重要,因为这只是我们项目的一小部分,不可能有太多时间投入其中。
至于语言,我更喜欢使用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分量的值来确定任何点的暗度。您可以设置一些阈值来确定暗像素。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 查找 jpeg 暗像素数的"easiest"方法是什么?