opencv灰度变换

图像处理中的灰度反转、对数变换和幂律(伽马)变换是一些常见的技术,主要用于图像增强、对比度调整以及特定场景的图像预处理。下面详细介绍这些技术的使用场景,并给出对应的C++代码示例。

灰度反转(Negative Transformation)

使用场景
  • 医学图像处理: 增强X光片或MRI图像的对比度。
  • 遥感图像: 反转地形图或卫星图像中的颜色,便于特定特征的分析。
  • 摄影艺术: 创造特殊的视觉效果。
实现方法

灰度反转的公式为:

g(x,y) = 255 - f(x,y)

其中 ( f(x,y) ) 是原始图像的像素值,( g(x,y) ) 是反转后的像素值。

对数变换(Log Transformation)

使用场景
  • 增强低灰度值: 提高图像中暗部细节的对比度。
  • 图像压缩: 压缩图像的动态范围,特别是用于科学数据的可视化(如频谱图)。
实现方法

对数变换的公式为:

g(x,y) = c \\cdot \\log(1 + f(x,y))

其中 ( c ) 是常数,一般取值为 1。

幂律(伽马)变换(Power-Law (Gamma) Transformation)

使用场景
  • 图像增强: 调整图像的亮度和对比度。
  • 显示设备校正: 修正显示器或打印机的非线性响应。
  • 医学图像处理: 改善CT扫描或MRI图像的可视化效果。
实现方法

伽马变换的公式为:

g(x,y) = c \\cdot f(x,y)\^\\gamma

其中 ( c ) 是常数,通常为 1,( \gamma ) 是伽马值,控制图像的对比度。

C++ 代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <iostream>
#include <cmath>

void invertImage(const cv::Mat& src, cv::Mat& dst) {
    dst = 255 - src;
}

void logTransform(const cv::Mat& src, cv::Mat& dst) {
    cv::Mat srcFloat;
    src.convertTo(srcFloat, CV_32F);
    dst = srcFloat.clone();
    dst += 1;
    cv::log(dst, dst);
    cv::normalize(dst, dst, 0, 255, cv::NORM_MINMAX);
    dst.convertTo(dst, CV_8U);
}

void gammaTransform(const cv::Mat& src, cv::Mat& dst, double gamma) {
    cv::Mat srcFloat;
    src.convertTo(srcFloat, CV_32F);
    cv::normalize(srcFloat, srcFloat, 0, 1, cv::NORM_MINMAX);
    cv::pow(srcFloat, gamma, dst);
    cv::normalize(dst, dst, 0, 255, cv::NORM_MINMAX);
    dst.convertTo(dst, CV_8U);
}

int main() {
    // 读取图像
    cv::Mat image = cv::imread("path_to_image.jpg", cv::IMREAD_GRAYSCALE);
    if (image.empty()) {
        std::cerr << "Could not open or find the image!" << std::endl;
        return -1;
    }

    // 灰度反转
    cv::Mat invertedImage;
    invertImage(image, invertedImage);

    // 对数变换
    cv::Mat logImage;
    logTransform(image, logImage);

    // 幂律(伽马)变换
    cv::Mat gammaImage;
    double gamma = 2.2; // 伽马值,可以根据需要调整
    gammaTransform(image, gammaImage, gamma);

    // 显示图像
    cv::imshow("Original Image", image);
    cv::imshow("Inverted Image", invertedImage);
    cv::imshow("Log Transformed Image", logImage);
    cv::imshow("Gamma Transformed Image", gammaImage);

    // 保存图像
    cv::imwrite("inverted_image.jpg", invertedImage);
    cv::imwrite("log_transformed_image.jpg", logImage);
    cv::imwrite("gamma_transformed_image.jpg", gammaImage);

    // 等待按键按下
    cv::waitKey(0);

    return 0;
}

代码解释

  1. 灰度反转:

    • 使用简单的矩阵操作 255 - src 进行反转。
  2. 对数变换:

    • 将图像转换为浮点型以进行精确计算。
    • 加1以避免对数变换中的对数零问题。
    • 应用对数变换并归一化图像。
  3. 伽马变换:

    • 将图像转换为浮点型并归一化到0-1范围。
    • 应用伽马变换公式并重新归一化到0-255范围。
  4. 读取和显示图像:

    • 读取图像,应用各种变换,并使用cv::imshow函数显示结果。
    • 保存结果图像以供后续使用。

通过这些变换,你可以有效地增强图像的细节,改善视觉效果。

相关推荐
青松@FasterAI15 分钟前
【程序员 NLP 入门】词嵌入 - 上下文中的窗口大小是什么意思? (★小白必会版★)
人工智能·自然语言处理
AIGC大时代30 分钟前
高效使用DeepSeek对“情境+ 对象 +问题“型课题进行开题!
数据库·人工智能·算法·aigc·智能写作·deepseek
硅谷秋水31 分钟前
GAIA-2:用于自动驾驶的可控多视图生成世界模型
人工智能·机器学习·自动驾驶
偶尔微微一笑43 分钟前
AI网络渗透kali应用(gptshell)
linux·人工智能·python·自然语言处理·编辑器
深度之眼1 小时前
2025时间序列都有哪些创新点可做——总结篇
人工智能·深度学习·机器学习·时间序列
晓数1 小时前
【硬核干货】JetBrains AI Assistant 干货笔记
人工智能·笔记·jetbrains·ai assistant
jndingxin1 小时前
OpenCV 图形API(60)颜色空间转换-----将图像从 YUV 色彩空间转换为 RGB 色彩空间函数YUV2RGB()
人工智能·opencv·计算机视觉
Sherlock Ma2 小时前
PDFMathTranslate:基于LLM的PDF文档翻译及双语对照的工具【使用教程】
人工智能·pytorch·语言模型·pdf·大模型·机器翻译·deepseek
知舟不叙2 小时前
OpenCV中的SIFT特征提取
人工智能·opencv·计算机视觉
kadog2 小时前
PubMed PDF下载 cloudpmc-viewer-pow逆向
前端·javascript·人工智能·爬虫·pdf