首页 > 其他分享 >OpenCV(cv::convertScaleAbs())

OpenCV(cv::convertScaleAbs())

时间:2024-09-23 14:13:43浏览次数:5  
标签:convertScaleAbs 缩放 CV OpenCV 图像 alpha cv

目录



cv::convertScaleAbs() 是 OpenCV 中用于将图像像素值缩放并转换为 8 位无符号整数类型的函数。它常用于处理计算结果为浮点数或负值的图像,特别是在图像处理过程中,如应用拉普拉斯算子、Sobel 算子等边缘检测操作后。



1. 函数定义

void cv::convertScaleAbs(
    InputArray src, 
    OutputArray dst, 
    double alpha = 1, 
    double beta = 0
);

参数:

  1. src:

    • 输入数组或图像。可以是任意深度的单通道或多通道数组,如 CV_32FCV_64FCV_16S 等。
  2. dst:

    • 输出数组或图像。dst 总是一个 8 位无符号整数图像(CV_8U),这是由 convertScaleAbs() 函数保证的。
  3. alpha:

    • 可选的缩放因子。默认为 1.0。此参数用来对输入图像的每个像素值进行缩放,结果为:dst(i) = saturate_cast<uchar>(alpha * src(i) + beta)
  4. beta:

    • 可选的添加常数。默认为 0。此参数在缩放之后向每个像素值添加一个偏移量。


2. 原理

convertScaleAbs() 主要执行以下三个步骤:

  1. 缩放: 将输入图像中每个像素值乘以一个缩放因子 alpha。这在处理如梯度或导数图像时非常有用,可以放大图像中数值较小的变化。

  2. 偏移: 在缩放后的像素值上加上一个常数 beta,可以用于调整图像的亮度。

  3. 转换到 8 位无符号整数类型: 函数将结果取绝对值并转换为 8 位无符号整数。具体来说,负值会被转换为正值,浮点数会被截断为整数,而超过 255 的值会被裁剪到 255。函数内部使用 saturate_cast<uchar>() 来确保值保持在 [0, 255] 范围内。



3. 示例

#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    // 读取图像
    Mat src = imread("image.jpg", IMREAD_GRAYSCALE);
    
    // 检查是否成功加载图像
    if (src.empty()) {
        return -1;
    }

    // 假设我们使用了 Sobel 算子或其他操作,并得到了一个 CV_16S 的图像
    Mat grad_x;
    Sobel(src, grad_x, CV_16S, 1, 0); // 计算 X 方向的梯度

    // 使用 convertScaleAbs 将 CV_16S 转换为 CV_8U
    Mat abs_grad_x;
    convertScaleAbs(grad_x, abs_grad_x);

    // 显示结果
    imshow("Sobel X", abs_grad_x);
    waitKey(0);

    return 0;
}
  1. 使用 Sobel 算子:

    • 在该示例中,我们首先对图像应用了 Sobel 算子来计算 X 方向的梯度。Sobel 的输出通常为 CV_16S,因为导数计算会导致负值。
  2. convertScaleAbs() 的应用:

    • convertScaleAbs() 用于将 Sobel 输出的 16 位有符号整数图像(CV_16S)转换为 8 位无符号整数图像(CV_8U)。它首先将图像像素取绝对值(避免负值),然后裁剪到 [0, 255] 范围内。


4. 参数作用详解

4.1 alpha 的作用

alpha 是一个缩放因子,常用于对输入图像的值进行比例调整。比如,在处理图像梯度时,梯度值可能比较小或比较大,直接显示会显得不明显。通过调整 alpha,可以放大或缩小这些值。

double alpha = 0.5;  // 缩小梯度值
convertScaleAbs(grad_x, abs_grad_x, alpha);

4.2 beta 的作用

beta 是一个偏移量,通常用于整体调整图像的亮度。比如,给图像中的每个像素增加一个常数值来提高亮度。

double beta = 50;  // 提高图像亮度
convertScaleAbs(grad_x, abs_grad_x, 1, beta);


5. 应用场景

  1. 梯度图像处理: cv::convertScaleAbs() 常用于处理导数和梯度图像,比如在应用 Sobel 算子或拉普拉斯算子后,结果图像可能包含负值,必须将其转换为正值并且适合显示。

  2. 浮点数图像处理: 如果你有浮点数格式(如 CV_32F)的图像结果,convertScaleAbs() 可以将其缩放到可显示的范围内。

  3. 归一化: 可以通过设置合适的 alphabeta 值,对图像进行缩放和归一化处理。



6. cv::convertScaleAbs()cv::normalize() 的区别

  • cv::normalize() 是一种标准化函数,用于将图像像素值缩放到一个指定的范围。它的功能更为广泛,可以用于最大最小值归一化、L2 归一化等。
  • cv::convertScaleAbs() 是一种缩放与取绝对值的函数,更加简化,常用于将结果转换为适合显示的 8 位图像。


总结

cv::convertScaleAbs() 是 OpenCV 中非常实用的工具,它通过缩放和取绝对值,将高精度的图像数据转换为适合显示的 8 位无符号整数图像。它在处理边缘检测、梯度运算、浮点图像时尤为常用,并且能够有效防止负值和过大数值带来的显示问题。



标签:convertScaleAbs,缩放,CV,OpenCV,图像,alpha,cv
From: https://www.cnblogs.com/keye/p/18426976

相关文章

  • OpenCV(cv::Laplacian())
    目录1.函数定义2.拉普拉斯算子的原理3.示例4.应用场景总结cv::Laplacian()是OpenCV中用于计算图像拉普拉斯算子(Laplacian)的函数。拉普拉斯算子是一种边缘检测方法,它通过计算每个像素点的二阶导数来识别快速变化的区域(如边缘)。1.函数定义voidcv::Laplacian(In......
  • 让求职变得简单!为什么你应该试试CVBee.ai的智能简历生成器
    摘要:在求职中,优秀的简历往往决定是否能获得面试机会。如果你需要一个智能、高效的工具来提升简历质量,CVBee.ai是值得推荐的选择。借助AI,CVBee.ai帮助生成专业简历并优化内容,提高通过招聘系统的概率,帮助你在激烈的职场竞争中脱颖而出。如今的求职市场竞争异常激烈,一份优秀的简历是......
  • ScanFormer:逐层抵达目标,基于特征金字塔的指代表达理解框架 | CVPR'24
    指代表达理解(REC)旨在在图像中定位由自由形式自然语言描述指定的目标对象。尽管最先进的方法取得了令人印象深刻的性能,但它们对图像进行了密集感知,包含与语言查询无关的多余视觉区域,导致额外的计算开销。这启发论文探讨一个问题:能否消除与语言无关的多余视觉区域,以提高模型的效率?......
  • OpenCV(Canny 边缘检测算法)
    目录1.高斯滤波(GaussianBlur)2.计算梯度强度和方向(GradientCalculation)3.非极大值抑制(Non-MaximumSuppression)3.1示例1.梯度强度矩阵(7x7)2.每个像素的梯度方向(7x7)3.非极大值抑制过程4.非极大值抑制后的矩阵(7x7)4.双阈值处理(DoubleThresholding)5.边缘连接(EdgeTracking......
  • 设计原理图:417-基于XCVU9P+ C6678的8T8R的无线MIMO平台
    基于XCVU9P+C6678的8T8R的无线MIMO平台一、板卡概述     北京太速科技板卡基于TI TMS320C6678DSP和XCVU9P高性能FPGA,FPGA接入4片AD9361无线射频,构建8输入8输出的无线MIMO平台,丰富的FPGA资源和8核DSP为算法验证和信号处理提供强大能力。二、技术指标 ● 板卡为......
  • OpenCV(图像锐化)
    目录1.图像锐化2.原理3.示例1.图像锐化图像锐化是一种图像增强技术,旨在通过增强图像的边缘信息,使图像看起来更加清晰和具有细节。图像锐化的核心思想是突出图像中的高频分量,这通常与图像中的边缘和快速变化的区域相关。2.原理图像锐化的基本原理是通过增强图像中像素......
  • execve
    目录glibcdemoglibcexecve()执行由pathname指定的程序。这会导致当前正在被调用进程运行的程序被一个新程序替换,且该新程序会重新初始化栈、堆,以及(已初始化和未初始化的)数据段。demoexecve(path,args,env):用execve()替换当前进程为ls命令。如果execve()执行成功,当......
  • [OpenCV] 数字图像处理 C++ 学习——16直方图均衡化、直方图比较 详细讲解+附完整代码
    文章目录前言1.直方图均衡化的理论基础(1)什么是直方图(2)直方图均衡化原理(3)直方图均衡化公式2.直方图比较理论基础(1)相关性(Correlation)——HISTCMP_CORREL(2)卡方(Chi-Square)——HISTCMP_CHISQR(3)十字交叉性(Intersection)——HISTCMP_INTERSECT(4)巴氏距离......
  • OpenCV(图像对比度)
    目录1.图像对比度2.对比度调整的原理3.示例4.调整对比度的效果1.图像对比度图像对比度是指图像中亮部和暗部之间的差异程度。对比度越高,亮区更亮,暗区更暗;对比度低时,亮区和暗区的差异不明显,图像显得平淡。2.对比度调整的原理图像对比度可以通过线性变换实现,公式如下:......
  • OpenCV(图像明度)
    目录1.图像明度(Brightness)2.明度调整的原理3.示例1.图像明度(Brightness)明度(Brightness)是图像中反映光亮程度的一个属性,通常用于描述像素的亮度水平。对于RGB图像,明度(Luminance)每个像素中红、绿、蓝通道的加权和。\[\text{Luminance}=0.299\timesR+0.587\timesG......