opencv灰度变换

2024-06-07 14:04
文章标签 opencv 灰度变换

本文主要是介绍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++ 代码示例

#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函数显示结果。
    • 保存结果图像以供后续使用。

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

这篇关于opencv灰度变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039379

相关文章

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性