十五、OpenCV中的图像浮雕技术

文章目录

一、浮雕的基本概念

浮雕效果(Embossing) 本质上是一种基于边缘检测的图像滤波,它通过增强图像的亮度变化方向(梯度),模拟出"光照从某个方向照射"形成的明暗凹凸感。

浮雕滤波器会:

  • 强化图像的边缘信息;
  • 让一个方向的边缘变亮,反方向的边缘变暗;
  • 使平坦区域接近灰色,从而模拟凹凸感。

二、原理与常用卷积核

浮雕是通过卷积实现的。

常用的浮雕卷积核(Emboss Kernel)如下(以灰度图为例):

从左上到右下的浮雕方向:

cpp 复制代码
[-2 -1  0
 -1  1  1
  0  1  2]

从右上到左下的浮雕方向:

cpp 复制代码
[ 0  1  2
 -1  1  1
 -2 -1  0]

该卷积核的作用是:

  • 对图像进行方向性差分;
  • 将某个方向的像素强化(亮),另一个方向的像素削弱(暗)。

卷积后的像素值范围可能会超出 [0,255],所以需要加上灰度偏移(通常加上 128)让图像回到可显示范围。

三、OpenCV 实现步骤

  1. 读取图像
  2. 转换为灰度图
  3. 定义浮雕卷积核
  4. 使用 filter2D() 卷积
  5. 加上灰度偏移
  6. 显示结果

完整示例代码:

cpp 复制代码
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int main()
{
    // 1. 读取原图
    Mat src = imread("example.jpg");
    if (src.empty()) {
        cout << "无法读取图像!" << endl;
        return -1;
    }

    // 2. 转为灰度图
    Mat gray;
    cvtColor(src, gray, COLOR_BGR2GRAY);

    // 3. 定义浮雕卷积核(从左上到右下)
    Mat kernel = (Mat_<float>(3,3) << -2, -1, 0,
                                      -1,  1, 1,
                                       0,  1, 2);

    // 4. 卷积
    Mat embossed;
    filter2D(gray, embossed, CV_32F, kernel);

    // 5. 加偏移并裁剪到[0,255]
    embossed = embossed + 128;
    embossed.convertTo(embossed, CV_8U);

    // 6. 显示结果
    imshow("Original", gray);
    imshow("Embossed", embossed);
    waitKey(0);
    return 0;
}
相关推荐
_李小白13 小时前
【android opencv学习笔记】Day 17: 目标追踪(MeanShift)
android·opencv·学习
入门工作者18 小时前
opencv 微小缺陷 频域实战
人工智能·opencv·计算机视觉
还是叫明18 小时前
OpenCV静态图像分割(抠图)
opencv·计算机视觉·图像分割·抠图
sali-tec21 小时前
C# 基于OpenCv的视觉工作流-章75-线-线角度
图像处理·人工智能·opencv·算法·计算机视觉
Hua-Jay21 小时前
OpenCV联合C++/Qt 学习笔记(二十三)----图像校正及单目位姿估计
c++·笔记·qt·opencv·学习·计算机视觉
Hua-Jay1 天前
OpenCV联合C++/Qt 学习笔记(二十四)----差值法检测移动物体、稠密光流法跟踪移动物体及稀疏光流法跟踪移动物体
c++·笔记·qt·opencv·学习·计算机视觉
Hua-Jay2 天前
OpenCV联合C++/Qt 学习笔记(二十二)----相机模型与投影及单目相机标定
c++·笔记·qt·opencv·学习·计算机视觉
sali-tec2 天前
C# 基于OpenCv的视觉工作流-章74-线-线距离
图像处理·人工智能·opencv·算法·计算机视觉
问窗2 天前
计算机视觉入门案例 高速公路车辆计数系统技术解析
python·opencv·计算机视觉
爱炸薯条的小朋友3 天前
全局锁的性能优势,以及链路优化为何常常低于预期——基于 `MatPoolsTest` 中小图池与大图池的实战复盘
opencv·算法·c#