opencv基础篇 ——(十一)常用照片处理函数

发布于:2024-05-09 ⋅ 阅读:(106) ⋅ 点赞:(0)

改善图像的亮度(illuminationChange)

        用于改善光照条件不佳导致的图像对比度低下或局部过暗/过亮的问题。该函数通过模拟全局和局部光照变化,旨在提高图像的整体视觉质量,特别是在低光照条件下,使得图像中的重要细节更加清晰可见。

函数原型

void cv::illuminationChange(
    InputArray src,
    OutputArray dst,
    float alpha = 0.2f,
    float beta = 0.4f
);

参数说明

  • src: 输入图像,通常为 cv::Mat 类型,表示待处理的灰度图像或彩色图像(BGR 或 RGB 格式)。如果输入的是彩色图像,内部会先将其转换为灰度图像进行处理。

  • dst: 输出图像,与输入图像 src 同样大小和类型。该图像存储经过光照变化增强后的结果。

  • alpha: 全局光照调整因子。它控制整体图像亮度的增益。取值范围通常为 0.0 到 1.0。较高的 alpha 值会使图像整体变得更亮,较低的 alpha 值则使图像整体变暗。

  • beta: 局部光照调整因子。它影响图像中对比度较低区域(暗区)的亮度提升程度。取值范围通常也是 0.0 到 1.0。较大的 beta 值会使暗区提亮得更多,较小的 beta 值则相对保守地提亮暗区。

函数工作原理

cv::illuminationChange() 函数执行以下基本步骤来实现光照变化增强:

  1. 图像预处理:如果输入是彩色图像,首先将其转换为灰度图像。

  2. 全局光照调整:对整个灰度图像应用线性变换,公式通常为 dst = src * alpha,其中 src 是原始灰度值,dst 是调整后的灰度值。这一步改变了图像的整体亮度。

  3. 局部对比度增强: a. 计算图像的局部自适应直方图均衡化(CLAHE),以增强局部对比度,特别是对于暗区。 b. 将增强后的局部对比度图像与原始图像进行融合,融合比例由 beta 参数控制。融合公式可能是 dst_local_enhanced = (1 - beta) * src + beta * clahe_output,其中 clahe_output 是局部对比度增强后的图像。 c. 对局部增强后的图像施加一定的阈值限制,防止过度提亮导致的失真。

  4. 合并全局和局部调整:将全局调整后的图像与局部对比度增强后的图像结合,通常采用加权平均或其他混合策略,以平衡全局亮度调整与局部对比度增强的效果。

  5. 输出结果:将最终处理后的像素值写入到输出图像 dst 中。如果是彩色输入,增强后的灰度图像会被转换回相应的彩色格式并写入 dst

应用场景

  • 低光照图像增强:在夜间监控、弱光摄影、医疗影像等领域,该函数可用于显著提升图像的可视性和细节表现。

  • 图像预处理:作为图像分析、目标检测、特征提取等计算机视觉任务的预处理步骤,改善光照条件有利于后续算法的性能。

  • 艺术效果:在图像编辑或创意应用中,可以利用该函数创建具有不同光照氛围的图像版本。

局部颜色更改(colorChange )

        用于改变图像中特定区域的颜色属性。该函数允许用户根据提供的掩模和指定的乘法系数来调整图像中红色、绿色和蓝色(RGB)分量的强度,从而实现局部或全局的颜色变化。

函数原型

void cv::colorChange(
    InputArray src,
    InputArray mask,
    OutputArray dst,
    float red_mul = 1.0f,
    float green_mul = 1.0f,
    float blue_mul = 1.0f
);

参数说明

  • src: 输入图像,通常为 cv::Mat 类型,表示待处理的彩色图像(BGR 或 RGB 格式)。

  • mask: 输入掩模图像,同样为 cv::Mat 类型。非零像素(通常设置为白色)标识出需要进行颜色调整的区域。掩模外的区域将保持原样。

  • dst: 输出图像,与输入图像 src 同样大小和类型。该图像存储经过颜色调整后的结果。

  • red_mul: 红色分量乘法系数。取值范围通常为 0.0 到 无穷大。大于 1.0 的值会使红色分量增强,小于 1.0 的值会使红色分量减弱,而等于 1.0 则保持红色分量不变。

  • green_mul: 绿色分量乘法系数。含义和取值范围与 red_mul 相同,用于调整绿色分量的强度。

  • blue_mul: 蓝色分量乘法系数。含义和取值范围与 red_mul 相同,用于调整蓝色分量的强度。

函数工作原理

cv::colorChange() 函数执行以下基本步骤来实现颜色调整:

  1. 掩模应用:根据提供的掩模图像,确定哪些像素需要进行颜色调整。掩模中的非零像素(有效区域)将进行后续的颜色操作,而零像素(无效区域)将保持原样。

  2. 颜色分量调整:对于掩模内的每个像素,分别对其 BGR 或 RGB 三个颜色分量进行乘法操作。具体来说,将每个分量值乘以其对应的乘法系数 (red_mulgreen_mulblue_mul)。这样可以增加或减少相应颜色成分的强度。

  3. 颜色空间转换(如果必要):如果输入图像为 RGB 格式,内部会将其转换为 OpenCV 默认的 BGR 格式进行处理,然后再将结果转换回 RGB 格式。

  4. 输出结果:将调整后的像素值写入到输出图像 dst 中,未被掩模覆盖的区域保持与 src 相同。

应用场景

  • 色彩校正:在拍摄过程中由于光照条件、相机设置等因素导致的色彩偏差,可以使用该函数对选定区域进行针对性的颜色调整,以达到更准确的色彩还原。

  • 图像风格化:在艺术创作或特效制作中,通过改变局部或全局的颜色属性,可以实现各种风格化的图像效果。

  • 图像融合:在图像拼接、无缝克隆等任务中,可以使用该函数对融合区域的颜色进行匹配,以减少接缝处的视觉突变。

图像融合(seamlessClone)

        用于图像合成的一个高级函数,它能够将源图像(src)中的内容无缝地插入到目标图像(dst)的指定位置,同时考虑源图像与目标图像周围环境的色彩、纹理和光照一致性,生成自然、无明显拼接痕迹的结果。

函数原型

void cv::seamlessClone(
    InputArray src,
    InputArray dst,
    InputArray mask,
    Point p,
    OutputArray blend,
    int flags
);

参数说明

  • src: 输入图像,通常为 cv::Mat 类型,表示待插入的源图像(例如,一个物体、人物或图标),通常是彩色图像(BGR 或 RGB 格式)。

  • dst: 输入图像,同样为 cv::Mat 类型,表示接收源图像的目标图像背景。源图像将被无缝地插入到该图像的指定位置。

  • mask: 输入掩模图像,为单通道 cv::Mat 类型,表示源图像中需要插入的目标区域。掩模中的非零像素(通常设置为白色)对应于源图像中需要克隆的部分,零像素(通常为黑色)则表示不需要克隆的区域。

  • pcv::Point 类型,指定源图像在目标图像中的插入位置。这个点对应于掩模图像中非零区域的左上角坐标(即源图像的左上角在目标图像中的位置)。

  • blend: 输出图像,与输入图像 src 和 dst 同样大小和类型。该图像存储经过无缝克隆处理后的结果。

  • flags: 克隆类型的标志,用于指定克隆算法的类型。支持以下两种模式:

    • cv::NORMAL_CLONE: 正常克隆模式,适用于大多数情况。该模式尝试保持源图像与目标图像之间色彩、纹理和光照的一致性,生成较为自然的融合效果。

    • cv::MIXED_CLONE: 混合克隆模式,适用于源图像与目标图像之间存在较大差异或需要产生特定艺术效果的情况。这种模式会在保持源图像主要特征的同时,适度吸收目标图像的纹理信息,生成更具创意性的融合结果。

函数工作原理

cv::seamlessClone() 函数执行以下基本步骤来实现无缝图像克隆:

  1. 掩模应用:根据提供的掩模图像,确定源图像中哪些部分需要克隆到目标图像。

  2. 色彩、纹理和光照分析:对源图像、目标图像以及目标图像中源图像插入位置周围的环境进行色彩、纹理和光照特性分析。

  3. 像素级融合:根据所选的克隆模式(flags 参数),对源图像与目标图像在插入位置及其附近的像素进行逐个融合。融合过程中,考虑源图像与周围环境的色彩、纹理和光照一致性,生成自然过渡的像素值。

  4. 输出结果:将无缝克隆后的像素值写入到输出图像 blend 中,未被掩模覆盖的区域保持与 dst 相同。

应用场景

  • 图像编辑与合成:在图像处理软件中,用于实现物体的移除、添加或替换,创建视觉上连贯的合成图像。

  • 艺术创作:通过无缝克隆,可以创造出超现实主义、梦幻或幽默的艺术作品,将原本不相关的元素融合到同一场景中。

  • 广告设计与特效制作:在电影、电视或数字广告中,无缝克隆技术常用于实现逼真的场景拼接、物体植入等特效。

去除纹理信息(textureFlattening)

        用于从输入图像中去除纹理信息,从而实现对图像背景或特定区域进行平滑处理。该函数有助于凸显图像中的主要结构和形状,同时消除或减弱不相关的纹理细节,这对于许多计算机视觉应用如物体检测、图像分割、特征提取等场景非常有用。

函数原型

void cv::textureFlattening(
    InputArray src,
    InputArray mask,
    OutputArray dst,
    float low_threshold = 30, 
    float high_threshold = 45,
    int kernel_size = 3
);

参数说明

  • src: 输入图像,通常为 cv::Mat 类型,表示待处理的彩色图像(通常为三通道 BGR 或 RGB 格式)。

  • mask: 输入掩模图像,同样为 cv::Mat 类型。非零像素(通常设置为白色)标识出需要进行纹理平滑处理的区域。掩模外的区域将保持原样。

  • dst: 输出图像,与输入图像 src 同样大小和类型。该图像存储经过纹理平滑处理后的结果。

  • low_threshold: 低阈值,用于初步筛选出可能包含纹理的像素。低于此阈值的像素被认为是具有低纹理强度,更有可能被平滑。

  • high_threshold: 高阈值,与低阈值配合使用。高于低阈值但低于高阈值的像素被认为具有中等纹理强度,可能参与后续的平滑处理。

  • kernel_size: 卷积核大小,用于定义计算局部纹理强度时使用的邻域大小。通常选择奇数以确保中心像素的存在。较大的 kernel_size 可能会更有效地去除纹理,但也可能导致边缘模糊。

函数工作原理

cv::textureFlattening() 函数执行以下基本步骤来实现纹理平滑:

  1. 计算局部纹理强度:对于掩模内每个像素,计算其邻域内像素颜色值的差异,形成一个局部差异矩阵。使用指定的卷积核大小和距离度量(默认为 L2 距离或指定的 Hamming 距离)计算该矩阵的纹理强度指标。

  2. 阈值化处理:将计算得到的纹理强度与给定的低阈值和高阈值进行比较。低于低阈值的像素被认为几乎没有纹理,直接采用掩模区域的平均颜色替换;高于高阈值的像素则保留原样,认为它们属于主要结构或边缘。处于两者之间的像素根据某种策略(如加权平均)进行平滑处理。

  3. 输出结果:将处理后的像素值写入到输出图像 dst 中,未被掩模覆盖的区域保持与 src 相同。

应用场景

  • 背景平滑:在监控视频流中,可以使用 cv::textureFlattening() 去除动态背景中的复杂纹理,以便更好地突出前景对象。

  • 文档图像预处理:对于扫描的文档图像,平滑背景纹理有助于减少噪声,提升 OCR(光学字符识别)的准确性。

  • 医学图像分析:在皮肤病变检测、细胞显微图像分析等场景中,平滑无关纹理有助于集中分析主要结构特征。

  • 艺术效果:在图像编辑或创意应用中,可以利用该函数创建独特的平滑或油画般的效果。

效果展示

  • 消除高光

  • 改变花朵颜色

  • 图片融合

去除纹理