2012-12-22 104 views
2

我目前正在与QPainter和QImage一起生成“热图”。我的方法包括用黑色到透明的QRadialGradients绘制多个圆作为QBrush(请参阅“强度图”)。然后,我将梯度图应用于强度图以获得所需的“热图”效果(请参阅“梯度图之后”)。QGradient椭圆混合

我遇到的问题在“After Gradient Map”图片中更为明显,即圆圈不能正确混合。圆圈重叠的地方似乎部分融合,但是对于边缘,您可以清楚地看到圆圈结束的位置(几乎是外光)。我想要一个在圆圈和混合之间没有可见边界的效果。

强度地图

Intensity Map

渐变映射(不同强度分布图)

After Gradient Map

代码

// 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。我一直在尝试各种混合模式,但都没有成功。我也已将渲染提示更改为HighQualityAlliiasing。我也尝试将圆形做得比径向渐变大得多,所以没有办法将渐变切掉或将边框应用到圆形的外侧。

任何想法?谢谢!

+0

你确定你看到你认为你在看什么吗?看起来像是给我的马鞭。 – JasonD

+0

@JasonD:我很确定我是......我正要离开这个[教程](http://dylanvester.com/post/Creating-Heat-Maps-with-NET-20-(C-Sharp ).aspx)这可能有类似的问题?这是一个[示例](http://i.stack.imgur.com/iont6.png)我在photoshop中制作的,它没有问题。 –

+0

您的Photoshop渐变线性? – JasonD

回答

4

我认为这是马赫显带,这是一种错觉,其中在亮度变化由视觉系统增强,引起亮或暗带,其实际上并不存在于图像中的外观的一种形式。通常情况下,这些是在两个不同区域之间的边界上看到的,但在这里我认为这是观察到的梯度的急剧不连续性。

这里有一些图像来演示问题:

该第一图像是在软件中计算的,并且由每三个圆的径向线性梯度绘制的。 Mach-band效应应该在圆圈之间重叠的边缘处可见,因为这些是渐变急剧变化的点。

Grayscale, banded

该第二图像是恰好相同的计算,但不是可沿半径线性,梯度被映射到一个曲线(I使用的第一埃尔米特基函数)。该乐队应该几乎完全消失:

Grayscale, smooth

,为什么这会影响colourised图像多,我不知道它。我认为在上述情况下,也许有引起colourisation有效作为一个调色板查找,从而导致额外的条带额外条带。

我粗略地执行相同的colourisation本地,也只是映射一个调色板,效果是相似的:

enter image description hereenter image description here

修复此使用QT的线性渐变可能是不平凡的(你可以尝试添加更多的控制点指向渐变,但你必须添加很多...),但是用软件计算这样的图像并不难。您还可以考虑其他一些后期处理效果,例如添加模糊和/或添加噪点。任何突破梯度不连续性的东西都可能有所帮助。

+0

感谢您的想法,我会进一步研究。 –

+0

我最终得到了一些类似于高斯分布的控制点,这与你发布的结果类似。再次感谢! –

0

我同意JasonD。

此外,请注意,Qt是在sRGB色彩空间,其不是线性的(其具有施加的伽马2.2)做线性混合。

要做到这一点吧,你需要做的线性光混合或内插,然后将其转换为sRGB(申请伽马)进行显示。