gpt4 book ai didi

qt - Q渐变椭圆混合

转载 作者:行者123 更新时间:2023-12-04 18:34:05 27 4
gpt4 key购买 nike

我目前正在使用 QPainter 和 QImage 生成“热图”。我的方法包括用黑色到透明的 QRadialGradients 绘制多个圆圈作为 QBrush(参见“强度图”)。然后我将渐变图应用到强度图以获得所需的“热图”效果(参见“渐变图之后”)。

我遇到的问题(在“After Gradient Map”图像中更为明显)是圆圈没有正确混合。圆圈重叠的地方似乎确实部分混合,但在边缘你可以清楚地看到圆圈结束的地方(几乎是外发光)。我想要一种在圆圈之间没有可见边界并正确混合的效果。

强度图

Intensity Map

Gradient 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。我一直在尝试各种混合模式,但都没有成功。我还将渲染提示更改为 HighQualityAntialiasing。我还尝试使圆圈比径向渐变大得多,因此渐变无法被切断或边框应用于圆圈的外部。

有什么想法吗?谢谢!

最佳答案

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

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

第一张图片是用软件计算的,由三个圆圈组成,每个圆圈都用径向线性渐变绘制。马赫带效应应该在圆之间的重叠边缘可见,因为这些是梯度急剧变化的点。

Grayscale, banded

第二张图像完全是相同的计算,但梯度不是沿半径呈线性,而是映射到曲线(我使用了第一个厄米基函数)。乐队应该几乎完全消失了:

Grayscale, smooth

至于为什么这会更多地影响彩色图像,我不确定是否如此。我认为在上面的例子中,可能有额外的 strip 是由着色实际上是调色板查找引起的,从而导致额外的 strip 。

我在本地进行了大致相同的着色,也只是简单地映射了一个调色板,效果是相似的:

enter image description here enter image description here

使用 QT 的线性渐变解决这个问题可能很重要(您可以尝试向渐变添加更多控制点,但您必须添加相当多的...),但是在软件中计算这样的图像不难。您还可以考虑其他一些后处理效果,例如添加模糊和/或添加噪点。任何打破梯度不连续性的方法都可能有所帮助。

关于qt - Q渐变椭圆混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14001699/

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