九:OpenCV图像锐化和边缘检测

常见业务场景中经常会需要对图片进行边缘锐化以清晰达到清晰图片目的,并借此利于图标边缘特征分析,本文主要介绍以下几种函数:
1.Sobel (边缘锐化)
2.Laplacian(边缘锐化,突出边缘)
3.Canny (边缘检测)

1.Sobel (边缘锐化)

定义:

#c++
void Sobel( InputArray src, OutputArray dst, int ddepth,
                         int dx, int dy, int ksize = 3,
                         double scale = 1, double delta = 0,
                         int borderType = BORDER_DEFAULT );
#python
def Sobel(src, ddepth, dx, dy, dst=None, ksize=None, scale=None, delta=None, borderType=None)

参数:
src:输入图像
dst:输出图像
ddepth:图像数据深度
dx: x方向导数
dy:y方向导数
ksize: Sobel 核的大小;它必须是1、3、5或7 (单数)
scale: 可选比例因子,默认情况下不应用缩放
delta:可选的在结果上添加偏移值
borderType:边界类型

作用: Sobel锐化与边缘检测

使用案例

#Python code
img=cv2.imread('xxx.png')
#边缘
sobelImage = cv2.Sobel(img, cv2.CV_8U, 0, 1, 3)
#叠加取或
bitwise_orImage = cv2.bitwise_or(img,sobelImage)
plt.figure("bitwise_orImage")
plt.title("bitwise_orImage")
plt.imshow(bitwise_orImage)
plt.show()

#C++ code
#include 
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    Mat src = imread("xxx.png", 0);
    Mat dst;
    Sobel(src, dst, CV_8U, 0, 1, 3);
    Mat Bitwise_orImage;
    bitwise_or(src,dst,Bitwise_orImage);
    namedWindow("Bitwise_orImage", 0);
    imshow("Bitwise_orImage", Bitwise_orImage);
    waitKey(0);
    return 0;
} 

效果

根据效果图可见,图片经过Sobel的y方向卷积边缘得到部分边缘,通过bitwise_or运算后得到锐化后的图片。

2.Laplacian(边缘锐化,突出边缘)

定义:

#c++
void Laplacian( InputArray src, OutputArray dst, int ddepth,
                             int ksize = 1, double scale = 1, double delta = 0,
                             int borderType = BORDER_DEFAULT );
#python
def Laplacian(src, ddepth, dst=None, ksize=None, scale=None, delta=None, borderType=None)

参数:
src:输入图像
dst:输出图像
ddepth:图像数据深度
ksize: 用于计算二阶导数滤波器的大小
scale: 可选比例因子,默认情况下不应用缩放
delta:可选的在结果上添加偏移值
borderType:边界类型

作用: Laplacian锐化与边缘检测

使用案例

#Python
img=cv2.imread("xxx.png")
laplacianImage_3 = cv2.Laplacian(img,cv2.CV_8U,3)
bitwise_orImage_laplacian = cv2.bitwise_or(img,laplacianImage_3)
plt.figure("bitwise_orImage_laplacian")
plt.title("bitwise_orImage_laplacian")
plt.imshow(bitwise_orImage_laplacian)
plt.show()

#C++ code
#include 
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    Mat src = imread("xxx.png", 0);
    Mat laplacianImage_3;
    Laplacian(src,laplacianImage_3,CV_8U,3);
    Mat bitwise_orImage_laplacian;
    bitwise_or(src,laplacianImage_3,bitwise_orImage_laplacian);
    namedWindow("bitwise_orImage_laplacian", 0);
    imshow("bitwise_orImage_laplacian", bitwise_orImage_laplacian);
    waitKey(0);
    return 0;
} 

效果

3.Canny (边缘检测)

定义:

#c++
void Canny( InputArray image, OutputArray edges,
                         double threshold1, double threshold2,
#python
def Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None)

参数:
image:输入图像
edges: 输出边界图像
threshold1: 滞后过程的第一个阈值。
threshold2: 滞后过程的第二个阈值。
apertureSize:Sobel 算子的滤波器大小
L2gradient: 是否采用更精确的方式计算图像梯度

作用: 使用Canny 算子进行边缘检测

使用案例

#Python
img=cv2.imread('xxx.png')
cannyImage_140 = cv2.Canny(img,140,180)
plt.figure("cannyImage_140")
plt.title("cannyImage_140")
plt.imshow(cannyImage_140)
plt.show()

#C++ code
#include 
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    Mat src = imread("xxx.png", 0);
    Mat cannyImage_140;
    Canny(src,cannyImage_140,140,180);
    namedWindow("cannyImage_140", 0);
    imshow("cannyImage_140", cannyImage_140);
    waitKey(0);
    return 0;
}

效果

相关推荐

Python-OpenCV亮度提升并去除图片阴影部分
八:OpenCV图像平滑处理二(C++/python)
七:OpenCV图像平滑处理一(C++/python)