文章目录
-
- 一、浮雕的基本概念
- 二、原理与常用卷积核
- [三、OpenCV 实现步骤](#三、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 实现步骤
- 读取图像
- 转换为灰度图
- 定义浮雕卷积核
- 使用 filter2D() 卷积
- 加上灰度偏移
- 显示结果
完整示例代码:
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;
}