> 技术文档 > Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)_浮雕图像边界提取

Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)_浮雕图像边界提取


一、 高通滤波

        高通滤波是对图像进行卷积操作,以保留图像中的快速变化部分(如边缘和细节),同时抑 制低频分量(如大面积平坦区域)。

应用场景

  • 边缘检测:提取物体轮廓和边界。
  • 特征提取:用于后续计算机视觉任务(如目标检测)。
  • 图像锐化:增强图像清晰度。

二、高通滤波——索贝尔算子

        索贝尔算子是一种经典的边缘检测算子,通过计算像素梯度,检测图像的水平和垂直边缘。

import cv2# 读取原图# 使用 OpenCV 读取图像,返回一个 BGR 格式的图像img = cv2.imread(\'./images/waiguoren.png\')# 将原图转换为灰度图# 灰度图是处理图像时常用的格式,它可以去除颜色信息,只保留亮度信息gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 计算水平方向的梯度# 通过索贝尔算子计算水平方向上的变化量,即图像在 X 轴方向上的梯度grad_x = cv2.Sobel(gray_img, cv2.CV_64F, 1, 0, ksize=3)# 计算垂直方向的梯度# 同样地,计算图像在 Y 轴方向上的变化量,即图像在 Y 轴方向上的梯度grad_y = cv2.Sobel(gray_img, cv2.CV_64F, 0, 1, ksize=3)# 计算梯度幅度# 通过计算水平方向和垂直方向的梯度值的平方和,再开根号,得到每个像素点的梯度幅度# 这是用来提取边缘信息的,边缘区域的梯度幅度通常较大magnitude = cv2.magnitude(grad_x, grad_y)magnitude = cv2.normalize(magnitude, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)cv2.imshow(\'img\', img)cv2.imshow(\'gray_img\', gray_img)cv2.imshow(\'magnitude\', magnitude)cv2.waitKey(0)cv2.destroyAllWindows()

三、高通滤波——沙尔算子

        沙尔算子是对索贝尔算子的优化版本,它在小窗口(如 3×3)中提供更高的精度。

        索贝尔算子的卷积核比沙尔算子具有更强的边缘检测能力,它在水平方向和垂直方向上采用了不同的权重,更加重视邻近像素的信息。

边缘检测的灵敏度

  • 沙尔算子:由于其权重较为均匀,它对图像的边缘变化较为敏感,但可能对噪声的反应也较强,因此边缘检测的结果可能不如索贝尔算子清晰。

  • 索贝尔算子:由于其加权方式更加注重中心像素及其周围像素的梯度变化,索贝尔算子在噪声较多的情况下能提供更稳定和清晰的边缘检测结果。

应用场景

  • 沙尔算子:适用于较为干净的图像(低噪声环境),由于其结构简单,计算开销较小。

  • 索贝尔算子:在噪声较多或需要更精确边缘检测的图像处理中,索贝尔算子表现更好,常用于实际应用中。

import cv2# 读取原图# 使用 OpenCV 读取图像,返回一个 BGR 格式的图像img = cv2.imread(\'./images/waiguoren.png\')# 将原图转换为灰度图# 灰度图是处理图像时常用的格式,它可以去除颜色信息,只保留亮度信息gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 计算水平方向的梯度# 通过索贝尔算子计算水平方向上的变化量,即图像在 X 轴方向上的梯度grad_x = cv2.Scharr(gray_img, cv2.CV_64F, 1, 0)# 计算垂直方向的梯度# 同样地,计算图像在 Y 轴方向上的变化量,即图像在 Y 轴方向上的梯度grad_y = cv2.Scharr(gray_img, cv2.CV_64F, 0, 1)# 计算梯度幅度# 通过计算水平方向和垂直方向的梯度值的平方和,再开根号,得到每个像素点的梯度幅度# 这是用来提取边缘信息的,边缘区域的梯度幅度通常较大magnitude = cv2.magnitude(grad_x, grad_y)magnitude = cv2.normalize(magnitude, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)cv2.imshow(\'img\', img)cv2.imshow(\'gray_img\', gray_img)cv2.imshow(\'magnitude\', magnitude)cv2.waitKey(0)cv2.destroyAllWindows()

四、高通滤波——拉普拉斯算子

        拉普拉斯算子是一种二阶微分算子。它的作用是计算图像中像素值的变化率,从而识别图像 中的边缘。

不再以x和y的方向计算,而是以圆方向计算变化率。因此不需要Gx+Gy。

特点

  • 边缘检测:拉普拉斯算子常常用作边缘检测的基础方法之一。

  • 图像增强:拉普拉斯算子有时被用来增强图像细节,去除模糊部分,提高图像的清晰度。

高通滤波器的对比与应用场景

算子

特点

适用场景

索贝尔

结合一阶导数,能检测水平和垂直边缘

边缘检测、特征提取

沙尔

索贝尔的改进版,适合处理高频变化区域,精度更高

精细边缘检测

拉普拉斯

二阶导数算子,检测方向无关的边缘,灵敏度高

图像锐化、边缘增强

 

import cv2import os# 图片文件夹位置dog_directory = \"./dog\"# 遍历文件夹中的所有图片image_paths = []for filename in os.listdir(dog_directory): # 获取文件完整路径 filepath = os.path.join(dog_directory, filename) # 检查文件是否为图片格式 if not filename.lower().endswith((\'.png\', \'.jpg\', \'.jpeg\')): continue # 读取图片 img = cv2.imread(filepath) # 将图像转灰度 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 应用拉普拉斯算子,计算图像方差 laplacian = cv2.Laplacian(gray_img, cv2.CV_64F) variance = laplacian.var() print(f\"Image: {filename}, Variance: {variance}\") if variance < 300: image_paths.append(filepath)image_paths
Image: 1.png, Variance: 2113.8365566209127Image: 2.png, Variance: 248.99712459101005Image: 3.png, Variance: 1420.862992791666Image: 4.png, Variance: 153.0638792511676[\'./dog\\\\2.png\', \'./dog\\\\4.png\']

五、图像浮雕与特效处理

        图像浮雕特效是仿造浮雕艺术而衍生的处理,它将要呈现的图像突起于石头表面,根据凹凸程度不同形成三维的立体效果。Python绘制浮雕图像是通过勾画图像的轮廓,并降低周围的像素值,从而产生一张具有立体感的浮雕效果图。

5.1、图像浮雕

dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])

参数:

  • src表示输入图像
  • ddepth表示目标图像所需的深度
  • kernel表示卷积核,一个单通道浮点型矩阵

import cv2import numpy as npimg=cv2.imread(\'./images/waiguoren.png\')# 转为灰度图像gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 浮雕# 第一个参数 输入图像# 第二个参数 -1 表示输出图像与输入图像具有相同的深度# 第三个参数 卷积核,浮雕卷积核# 第四个参数 dst 输出图像,默认是 Noneembossed_img = cv2.filter2D(gray_img, -1, np.array([[-2, -1, 0], [-1, 1, 1], [0, 1, 2]]), dst=gray_img)# 显示结果cv2.imshow(\'img\', img)cv2.imshow(\'img_gray\', img_gray)cv2.imshow(\'embossed_img\', embossed_img)cv2.waitKey(0)cv2.destroyAllWindows()

5.2、油画效果

        油画效果使图像看起来像是由油画笔刷绘制的,通常使用平滑化和颜色混合来实现。

cv2.xphoto.oilPainting(src, (size, dyn_ratio))

参数:

  • src:输入图像。

  • (size, dyn_ratio):大小和动态比例,影响油画效果的强度和样式。

import cv2import numpy as npimg=cv2.imread(\'./images/waiguoren.png\')# 转为灰度图像gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 油画效果oil_img = cv2.xphoto.oilPainting(img,7,20)# 显示结果cv2.imshow(\'img\', img)cv2.imshow(\'img_gray\', img_gray)cv2.imshow(\'oil_img\', oil_img)cv2.waitKey(0)cv2.destroyAllWindows()

5.3、彩色映射

        彩色映射通过将图像的灰度值映射到不同的颜色范围,创造不同的视觉效果。例如,可以使用伪彩色来增强图像的表现力。

dst = cv2.applyColorMap(src, colormap)

参数:

  • src:灰度图像。

  • colormap:选择的颜色映射类型。

import cv2import numpy as npimg=cv2.imread(\'./images/waiguoren.png\')# 转为灰度图像gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 彩色映射color_img = cv2.applyColorMap(img, cv2.COLORMAP_HSV)# 显示结果cv2.imshow(\'img\', img)cv2.imshow(\'img_gray\', img_gray)cv2.imshow(\'color_img\', color_img)cv2.waitKey(0)cv2.destroyAllWindows()

5.4、镜像效果

        镜像效果是通过将图像进行水平或垂直翻转,来创建对称图像的一种方式。

dst = cv2.flip(src, flipCode)

参数:

  • src:输入图像。

  • flipCode:翻转类型。1表示水平翻转,0表示垂直翻转,-1表示水平和垂直都翻转。

import cv2import numpy as npimg=cv2.imread(\'./images/waiguoren.png\')# 转为灰度图像gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 镜像flip_img = cv2.flip(img,-1)# 显示结果cv2.imshow(\'img\', img)cv2.imshow(\'img_gray\', img_gray)cv2.imshow(\'flip_img\', flip_img)cv2.waitKey(0)cv2.destroyAllWindows()

5.5、油画效果和浮雕结合

import cv2import numpy as npimg=cv2.imread(\'./images/waiguoren.png\')# 转为灰度图像gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 浮雕embossed_img = cv2.filter2D(gray_img, -1, np.array([[-2, -1, 0], [-1, 1, 1], [0, 1, 2]]), dst=gray_img)# 油画combined = cv2.xphoto.oilPainting(embossed_img,7,20)# 显示结果cv2.imshow(\'img\', img)cv2.imshow(\'img_gray\', img_gray)cv2.imshow(\'combined\', combined)cv2.waitKey(0)cv2.destroyAllWindows()