首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于QBarSeries的RGB直方图

基于QBarSeries的RGB直方图
EN

Stack Overflow用户
提问于 2018-11-16 15:53:53
回答 1查看 1.1K关注 0票数 0

我遵循这个示例用Qt绘制一个RGB直方图。我有三个不同的QBarSets,每个彩色频道一个。

我现在的问题是,所有的酒吧都是并排的。有可能在彼此面前画出条子吗?

这就是现在的样子:

这就是我想要的:链接

在我的例子中,由于这些条子都是并排画的,所以它们太窄了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-19 09:20:32

我用QStackedBarSeries和一些手工计算解决了我的问题。

我的守则:

代码语言:javascript
复制
// Histogramms
std::vector<int> nGrayValues(NOGRAYLEVELS, 0);
std::vector<int> nRedValues(NOGRAYLEVELS, 0);
std::vector<int> nGreenValues(NOGRAYLEVELS, 0);
std::vector<int> nBlueValues(NOGRAYLEVELS, 0);

QRgb* imPixels= reinterpret_cast< QRgb* >(image.bits());
for (quint64 i = 0; i < numberPixels; i++) {
    nGrayValues[static_cast<unsigned int>(qGray(imPixels[i]))]++;
    nRedValues[static_cast<unsigned int>(qRed(imPixels[i]))]++;
    nGreenValues[static_cast<unsigned int>(qGreen(imPixels[i]))]++;
    nBlueValues[static_cast<unsigned int>(qBlue(imPixels[i]))]++;
}

QStackedBarSeries* pSeries = new QStackedBarSeries();

QBarSet* grayBarSet = new QBarSet("Gray");
grayBarSet->setColor(Qt::black);
QBarSet* redBarSet = new QBarSet("Red");
redBarSet->setColor(Qt::red);
QBarSet* greenBarSet = new QBarSet("Green");
greenBarSet->setColor(Qt::green);
QBarSet* blueBarSet = new QBarSet("Blue");
blueBarSet->setColor(Qt::blue);

double totalMaxValue = 0.0;
if (numberPixels != 0) {
    double numberPixels_f = static_cast<double>(numberPixels);
    for (unsigned int i = 0; i < NOGRAYLEVELS; i++) {

        // Helper function
        auto calcPart = [=](int value, int& maxValue) -> int 
                        {
                            int temp = value - maxValue;
                            if (temp > 0) {
                                maxValue = value;
                                return temp;
                            } else {
                                return 0;
                            }
                         };

        int grayPart = 0, redPart = 0, greenPart = 0, bluePart = 0, maxPart = 0;
        grayPart = calcPart(nGrayValues[i], maxPart);
        redPart = calcPart(nRedValues[i], maxPart);
        greenPart = calcPart(nGreenValues[i], maxPart);
        bluePart = calcPart(nBlueValues[i], maxPart);

        // normalize histogramm entries as procent
        *grayBarSet << grayPart * 100.0 / numberPixels_f;
        *redBarSet << redPart * 100.0 / numberPixels_f;
        *greenBarSet << greenPart * 100.0 / numberPixels_f;
        *blueBarSet << bluePart * 100.0 / numberPixels_f;

        double m1 = std::max(gray, red);
        double m2 = std::max(green, blue);
        double maxValue = std::max(m1, m2);
        if (maxValue > totalMaxValue) {
            totalMaxValue = maxValue;
        }
    }
}

pSeries->append(grayBarSet);
pSeries->append(redBarSet);
pSeries->append(greenBarSet);
pSeries->append(blueBarSet);

// add series to the chart and update axisY
pChart->removeAllSeries();
axisY->setRange(0, totalMaxValue);
pChart->addSeries(pSeries);

单个颜色按固定顺序绘制(灰色、->、红色、->、绿色、->蓝色)。

其结果是:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53341304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档