gpt4 book ai didi

c++ - 直方图对于暗图像不准确

转载 作者:行者123 更新时间:2023-11-28 06:56:20 24 4
gpt4 key购买 nike

我正在使用下一个算法从 YUV420sp 图像计算直方图。似乎可行,但对于全黑图像,结果并非 100% 准确。当图像很暗时,我希望在直方图的左侧有一个高拾取,表明图像太暗,但这种情况下的算法显示的是一条平线,没有拾取。在其他光照场景下,直方图似乎是准确的。

void calculateHistogram(const unsigned char* yuv420sp, const int yuvWidth, const int yuvHeight, const int histogramControlHeight, int* outHistogramData)
{
const int BINS = 256;

// Clear the output

memset(outHistogramData, 0, BINS * sizeof(int));

// Get YUV brightness values

const int totalPixels = yuvWidth * yuvHeight;

for (int index = 0; index < totalPixels; index++)
{
char brightness = yuv420sp[index];
outHistogramData[brightness]++;
}

// Get the maximum brightness

int maxBrightness = 0;

for (int index = 0; index < BINS; index++)
{
if (outHistogramData[index] > maxBrightness)
{
maxBrightness = outHistogramData[index];
}
}

// Normalize to fit the UI control height

const int maxNormalized = BINS * histogramControlHeight / maxBrightness;

for(int index = 0; index < BINS; index++)
{
outHistogramData[index] = (outHistogramData[index] * maxNormalized) >> 8;
}
}

[由 galop1n 解决] 虽然 Galop1n 实现要好得多,但我正在使用更正更新此版本以防对任何人有用。

变化:

1) 将亮度值读入 unsigned char 而不是 char。

2) 将 UI 规范化划分置于规范化循环中。

void calculateHistogram(const unsigned char* yuv420sp, const int yuvWidth, const int yuvHeight, const int histogramCanvasHeight, int* outHistogramData)
{
const int BINS = 256;

// Clear the output

memset(outHistogramData, 0, BINS * sizeof(int));

// Get YUV brightness values

const int totalPixels = yuvWidth * yuvHeight;

for (int index = 0; index < totalPixels; index++)
{
unsigned char brightness = yuv420sp[index];
outHistogramData[brightness]++;
}

// Get the maximum brightness

int maxBrightness = 0;

for (int index = 0; index < BINS; index++)
{
if (outHistogramData[index] > maxBrightness)
{
maxBrightness = outHistogramData[index];
}
}

// Normalize to fit the UI control height

for(int index = 0; index < BINS; index++)
{
outHistogramData[index] = outHistogramData[index] * histogramCanvasHeight / maxBrightness;
}
}

最佳答案

您的实现中至少存在两个错误。

  1. 由于使用了一个临时的 signed char 类型,所以按亮度进行索引。
  2. 最终的归一化结果可能会受到控件高度值和容器中像素的最大计数的影响。因此,不能真正将除法置于循环之外。

我还建议使用 std::array(需要 c++11)来存储结果而不是原始指针,因为存在调用者没有为什么分配足够空间的风险将使用该功能。

#include <algorithm>
#include <array>

void calculateHistogram(const unsigned char* yuv420sp, const int yuvWidth, const int yuvHeight, const int histogramControlHeight, std::array<int, 256> &outHistogramData ) {
outHistogramData.fill(0);
std::for_each( yuv420sp, yuv420sp + yuvWidth * yuvHeight, [&](int e) {
outHistogramData[e]++;
} );
int maxCountInBins = * std::max_element( begin(outHistogramData), end(outHistogramData) );
for( int &bin : outHistogramData )
bin = bin * histogramControlHeight / maxCountInBins;
}

关于c++ - 直方图对于暗图像不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23132394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com