3

私は現在、QPainterとQImageを使用して「ヒートマップ」の生成に取り組んでいます。私の方法は、QBrushとして黒から透明のQRadialGradientsで複数の円を描くことで構成されています(「強度マップ」を参照)。次に、グラデーションマップを強度マップに適用して、目的の「ヒートマップ」効果を取得します(「グラデーションマップ後」を参照)。

私が抱えている問題は、「グラデーションマップの後」の画像でより明確になりますが、円が正しくブレンドされていないことです。円が重なっている場所は部分的に混ざり合っているように見えますが、端に向かって、円がどこで終わるか(ほとんど外側の輝き)をはっきりと見ることができます。円の間に境界線が見えず、正しくブレンドされる効果が欲しいのですが。

強度マップ

強度マップ

グラデーションマップ後(異なる強度マップ)

グラデーションマップ後

コード

// Setup QImage and QPainter
QImage *map = new QImage(500, 500, QImage::Format_ARGB32);
map->fill(QColor(255, 255, 255, 255));
QPainter paint(map);
paint.setRenderHint(QPainter::HighQualityAntialiasing);

// Create Intensity map
std::vector<int> record = disp_data[idx]; // Data
for(int j = 1, c = record.size(); j < c; ++j) {
    int dm = 150 + record[j] * 100 / 255; // Vary the diameter

    QPen g_pen(QColor(0, 0, 0, 0));
    g_pen.setWidth(0);
    QRadialGradient grad(sensors[j-1].x, sensors[j-1].y, dm/2); // Create Gradient
    grad.setColorAt(0, QColor(0, 0, 0, record[j])); // Black, varying alpha
    grad.setColorAt(1, QColor(0, 0, 0, 0)); // Black, completely transparent
    QBrush g_brush(grad); // Gradient QBrush
    paint.setPen(g_pen);
    paint.setBrush(g_brush);
    paint.drawEllipse(sensors[j-1].x-dm/2, sensors[j-1].y-dm/2, dm, dm); // Draw circle
}

// Convert to heat map
for(int i = 0; i < 500; ++i) {
    for(int j = 0; j < 500; ++j) {
        int b = qGray(map->pixel(i, j));
        map->setPixel(i, j, grad_map->pixel(b, 0)); //grad_map is a QImage gradient map
    }
}

ご覧のとおり、サークルにはQPenはありません。私はさまざまなブレンディングモードを試しましたが、成功しませんでした。また、レンダリングヒントをHighQualityAntialiasingに変更しました。また、円を放射状のグラデーションよりもはるかに大きくしてみたので、グラデーションをカットオフしたり、円の外側に境界線を適用したりする方法はありません。

何か案は?ありがとう!

4

2 に答える 2

5

これはマッハバンドの一種だと思います。これは、視覚系によって輝度の変化が強調され、実際には画像に存在しない明るいバンドまたは暗いバンドが現れる錯視です。通常、これらは2つの異なる領域の境界に見られますが、ここの場合、観察されている勾配の急激な不連続性であると思います。

この問題を示すいくつかの画像を次に示します。

この最初の画像はソフトウェアで計算され、それぞれが放射状の線形グラデーションで描かれた3つの円で構成されています。マッハバンド効果は、勾配が急激に変化するポイントであるため、円間のオーバーラップのエッジで表示されるはずです。

グレースケール、縞模様

この2番目の画像はまったく同じ計算ですが、半径に沿って線形である代わりに、勾配が曲線にマッピングされます(最初のエルミート基底関数を使用しました)。バンドはほぼ完全に消えているはずです:

グレースケール、スムーズ

これがカラー画像にさらに影響を与える理由については、私にはわかりません。上記の場合、おそらくパレットルックアップである色付けによって引き起こされる追加のバンディングがあり、追加のバンディングが発生すると思います。

ローカルでほぼ同じ色付けを実行し、パレットをマッピングするだけで、効果は似ています。

ここに画像の説明を入力してください ここに画像の説明を入力してください

QTの線形グラデーションを使用してこれを修正することは、おそらく簡単ではありません(グラデーションにさらに多くのコントロールポイントを追加してみることができますが、かなりの数を追加する必要があります...)が、ソフトウェアでそのような画像を計算することは難しくありません。ぼかしの追加やノイズの追加など、他のいくつかの後処理効果を検討することもできます。勾配の不連続性を壊すものは、おそらく役立つでしょう。

于 2012-12-22T13:08:25.923 に答える
0

JasonDに同意します。

さらに、QtはsRGB色空間で線形ブレンディングを行っていることに注意してください。これは線形ではありません(ガンマ2.2が適用されています)。

これを正しく行うには、線形光でブレンドまたは補間を行ってから、表示用にsRGB(ガンマを適用)に変換する必要があります。

于 2012-12-22T16:03:03.970 に答える