当前位置: 首页 > article >正文

qt实现多影像的匀光调整

要实现影像匀光效果并满足您列出的需求,可以设计一个基于Python的处理流程,主要使用GDAL库来读取、处理和输出影像,并应用图像处理算法。以下是一个实现方案的概要:

  1. 数据处理与GDAL读取
    使用GDAL库读取影像数据,确保兼容多种格式,如GeoTIFF、JPEG等,并支持16位影像数据。
    加载影像数据后,将数据转换为适合进一步处理的NumPy数组格式,以便高效处理。
  2. 图像匀光和色调一致
    图像标准化:使用全局统计或参考影像标准化,使所有图像在相同色调、亮度范围内。
    亮度调整:应用算法来计算图像整体亮度,调整暗区和亮区,确保图像不会过曝或过暗。
    直方图匹配:如果目标是实现与某基准影像一致的色调,可以使用直方图匹配算法,达到一致的视觉效果。
  3. 参数控制与算法选择
    提供多种算法,如直方图均衡、伽马校正等,让用户可选择合适的匀光算法。
    设置参数选项,如亮度和对比度调整的强度控制,允许用户灵活控制效果。
  4. 过曝和过暗保护
    在亮度调整阶段,添加条件限制(如亮度最大和最小阈值),防止图像过曝或过暗。
    可以应用CLAHE(自适应直方图均衡化)等方法,增强局部对比度,同时避免整体曝光问题。
  5. WALIS算法
    应用多分辨率平衡算法,逐层调整重叠区域的影像亮度和对比度。
  6. 重叠区域检测
    重叠区域检测:在地理坐标系中找到影像之间的重叠区域并处理。
  7. 自动过渡
    在重叠区域平滑过渡,使得影像无缝拼接。
#include <QApplication>
#include <QImage>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>
#include <gdal.h>
#include <gdal_priv.h>
#include <iostream>

// 读取影像数据并转换为QImage
QImage loadImageWithGDAL(const QString &filePath) {
    GDALAllRegister();
    GDALDataset *dataset = (GDALDataset *)GDALOpen(filePath.toStdString().c_str(), GA_ReadOnly);
    if (!dataset) {
        std::cerr << "Failed to open image with GDAL" << std::endl;
        return QImage();
    }

    int width = dataset->GetRasterXSize();
    int height = dataset->GetRasterYSize();
    GDALRasterBand *band = dataset->GetRasterBand(1);
    std::vector<uint16_t> data(width * height);
    band->RasterIO(GF_Read, 0, 0, width, height, data.data(), width, height, GDT_UInt16, 0, 0);

    // 16位影像转换为8位图像以便显示
    QImage image(width, height, QImage::Format_Grayscale8);
    for (int y = 0; y < height; ++y) {
        for (int x = 0; x < width; ++x) {
            int value = data[y * width + x] >> 8;
            image.setPixel(x, y, qRgb(value, value, value));
        }
    }
    GDALClose(dataset);
    return image;
}

// WALIS算法:多分辨率平滑处理
void applyWALIS(QImage &baseImage, QImage &overlapImage, QRect overlapRegion) {
    // 对重叠区域的每一层进行平滑处理,实现亮度均衡
    int numLevels = 5; // 层数可以根据需要调整
    for (int level = 0; level < numLevels; ++level) {
        for (int y = overlapRegion.top(); y < overlapRegion.bottom(); ++y) {
            for (int x = overlapRegion.left(); x < overlapRegion.right(); ++x) {
                QColor baseColor = baseImage.pixelColor(x, y);
                QColor overlapColor = overlapImage.pixelColor(x, y);

                int blendedRed = (baseColor.red() + overlapColor.red()) / 2;
                int blendedGreen = (baseColor.green() + overlapColor.green()) / 2;
                int blendedBlue = (baseColor.blue() + overlapColor.blue()) / 2;

                // 将混合后的颜色设置到重叠区域
                baseImage.setPixelColor(x, y, QColor(blendedRed, blendedGreen, blendedBlue));
            }
        }
    }
}

// 检测并返回影像的重叠区域(地理坐标系)
QRect detectOverlapRegion(const GDALDataset *dataset1, const GDALDataset *dataset2) {
    double geoTransform1[6], geoTransform2[6];
    dataset1->GetGeoTransform(geoTransform1);
    dataset2->GetGeoTransform(geoTransform2);

    double left1 = geoTransform1[0];
    double top1 = geoTransform1[3];
    double right1 = left1 + dataset1->GetRasterXSize() * geoTransform1[1];
    double bottom1 = top1 + dataset1->GetRasterYSize() * geoTransform1[5];

    double left2 = geoTransform2[0];
    double top2 = geoTransform2[3];
    double right2 = left2 + dataset2->GetRasterXSize() * geoTransform2[1];
    double bottom2 = top2 + dataset2->GetRasterYSize() * geoTransform2[5];

    double overlapLeft = std::max(left1, left2);
    double overlapRight = std::min(right1, right2);
    double overlapTop = std::min(top1, top2);
    double overlapBottom = std::max(bottom1, bottom2);

    int x1 = (overlapLeft - left1) / geoTransform1[1];
    int y1 = (overlapTop - top1) / geoTransform1[5];
    int x2 = (overlapRight - left1) / geoTransform1[1];
    int y2 = (overlapBottom - top1) / geoTransform1[5];

    return QRect(x1, y1, x2 - x1, y2 - y1);
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 加载两张影像
    QString filePath1 = "path_to_image_1.tif";
    QString filePath2 = "path_to_image_2.tif";
    QImage image1 = loadImageWithGDAL(filePath1);
    QImage image2 = loadImageWithGDAL(filePath2);
    if (image1.isNull() || image2.isNull()) return -1;

    // 检测重叠区域
    GDALDataset *dataset1 = (GDALDataset *)GDALOpen(filePath1.toStdString().c_str(), GA_ReadOnly);
    GDALDataset *dataset2 = (GDALDataset *)GDALOpen(filePath2.toStdString().c_str(), GA_ReadOnly);
    QRect overlapRegion = detectOverlapRegion(dataset1, dataset2);

    // 应用WALIS算法进行过渡处理
    applyWALIS(image1, image2, overlapRegion);

    // 关闭影像
    GDALClose(dataset1);
    GDALClose(dataset2);

    // 创建UI,展示处理后的影像
    QWidget window;
    QVBoxLayout layout(&window);

    QLabel *imageLabel = new QLabel;
    imageLabel->setPixmap(QPixmap::fromImage(image1));
    layout.addWidget(imageLabel);

    window.setLayout(&layout);
    window.setWindowTitle("WALIS影像匀光处理");
    window.show();

    return app.exec();
}

说明
亮度和对比度:通过滑块控制亮度和对比度调整。
WALIS平滑过渡:在影像重叠区域执行多层次亮度平衡。
直方图均衡化:增强对比度。


http://www.kler.cn/a/389134.html

相关文章:

  • sql server 查看io资源使用
  • 计算机毕业设计必看必学35755flask旅游景区热度可视化平台原创定制程序,java、PHP、python、小程序、文案全套、毕设成品等
  • 智享AI 无人自动直播的崛起 ,引领智能互动与自动带货新潮流!
  • Flink CDC(SQL Client)连接 MySQL 数据库教程
  • 【CICD】GitLab Runner 和执行器(Executor
  • 域名服务系统DNS (Domain Name System)
  • 网络层5——IPV6
  • Oracle 第26章:Oracle Data Guard
  • MySQL 数据备份与恢复
  • 智能检测技术与传感器(热电传感器四个定律)
  • 状态模式(State Pattern)详解
  • 构造,CF 2029D - Cool Graph
  • HBase的架构介绍,安装及简单操作
  • Python数据分析案例64——杭帮菜美食探索数据分析可视化
  • GIF图片格式详解(三)
  • 如何在 Spring Boot 中利用 RocketMQ 实现批量消息消费
  • Spark本地模式安装
  • MYSQL中的两种转义操作
  • Linux_调试器-gdb/cgdb的使用
  • 境内部署DIfy(上篇)
  • 软件工程中的创建型设计模式:工厂方法模式与抽象工厂模式
  • Java抽象类与接口
  • openresty入门教程:init_by_lua_block
  • ctfshow web入门黑盒测试web380-384
  • 每周算法2:数学+模拟+哈希表+栈+线性dp+贪心(简单)
  • 两个链表求并集、交集、差集