7.4.1 Soble边缘检测
7.4.1 soble边缘检测
图像的彩色信息在进行边缘检测时通常是多余的,因此可以在进行边缘检测前先把彩色图像转换成灰度图像。直观的感觉,灰度图像中的边缘一定是变化相对比较剧烈的区域,那么这个区域灰度值的一阶导数便是取极大值或者极小值。
图7-15 小猪佩奇铅笔画
soble边缘检测(见图7-16)正是基于这一原理,在opencv中的函数定义如下:
sobel(src, ddepth, dx, dy, ksize=none, scale=none, delta=none, bordertype=none)
其中主要的参数如下。
? ddepth:深度类型,通常用cv2.cv_64f表示64位浮点数即64 float。
? dx:x方向的导数,1表示取导,0表示不取导。
? dy:y方向的导数,1表示取导,0表示不取导。
? ksize:卷积核大小。
图7-16 soble边缘检测示意图
首先加载需要的库文件:
import cv2
from matplotlib import pyplot as plt
import numpy as np
加载测试图片(见图7-17a),并转换成灰度图像:
img=cv2.imread("../picture/smallpig.jpeg")
gray_img=cv2.cvtcolor(img, cv2.color_rgb2gray)
对图像进行边缘检测(见图7-17b):
#sobel边缘检测
sobel = cv2.sobel(gray_img,cv2.cv_64f,0,1)
为了显示方便,对图像进行反转,黑色和白色会颠倒(见图7-17c),后面的案例默认都会进行翻转显示。
notsobel=cv2.bitwise_not(sobel)
图7-17 soble边缘检测示例(一)
需要指出的是,当dx设置为1表示在x轴方向上进行边缘检测,当dy设置为1表示在y轴方向上进行边缘检测。如图7-18所示,一共有四个子图,子图a是原始图像,子图b对y轴方向取导,仅在y轴方向的边缘会被忽略,子图c对x轴方向取导,仅在x轴方向的边缘会被忽略,子图d对x轴和y轴两个方向同时取导,在x轴和y轴方向的边缘都会被忽略。
img=cv2.imread("../picture/sobel.jpeg")
gray_img=cv2.cvtcolor(img, cv2.color_rgb2gray)
#sobel边缘检测
sobel01 = cv2.sobel(gray_img,cv2.cv_64f,0,1)
#对二值图像进行反转,黑白颠倒
sobel01=cv2.bitwise_not(sobel01)
#sobel边缘检测
sobel10 = cv2.sobel(gray_img,cv2.cv_64f,1,0)
#对二值图像进行反转,黑白颠倒
sobel10=cv2.bitwise_not(sobel10)
#sobel边缘检测
sobel11 = cv2.sobel(gray_img,cv2.cv_64f,1,1)
#对二值图像进行反转,黑白颠倒
sobel11=cv2.bitwise_not(sobel11)
图7-18 soble边缘检测示例(二)
图像的彩色信息在进行边缘检测时通常是多余的,因此可以在进行边缘检测前先把彩色图像转换成灰度图像。直观的感觉,灰度图像中的边缘一定是变化相对比较剧烈的区域,那么这个区域灰度值的一阶导数便是取极大值或者极小值。
图7-15 小猪佩奇铅笔画
soble边缘检测(见图7-16)正是基于这一原理,在opencv中的函数定义如下:
sobel(src, ddepth, dx, dy, ksize=none, scale=none, delta=none, bordertype=none)
其中主要的参数如下。
? ddepth:深度类型,通常用cv2.cv_64f表示64位浮点数即64 float。
? dx:x方向的导数,1表示取导,0表示不取导。
? dy:y方向的导数,1表示取导,0表示不取导。
? ksize:卷积核大小。
图7-16 soble边缘检测示意图
首先加载需要的库文件:
import cv2
from matplotlib import pyplot as plt
import numpy as np
加载测试图片(见图7-17a),并转换成灰度图像:
img=cv2.imread("../picture/smallpig.jpeg")
gray_img=cv2.cvtcolor(img, cv2.color_rgb2gray)
对图像进行边缘检测(见图7-17b):
#sobel边缘检测
sobel = cv2.sobel(gray_img,cv2.cv_64f,0,1)
为了显示方便,对图像进行反转,黑色和白色会颠倒(见图7-17c),后面的案例默认都会进行翻转显示。
notsobel=cv2.bitwise_not(sobel)
图7-17 soble边缘检测示例(一)
需要指出的是,当dx设置为1表示在x轴方向上进行边缘检测,当dy设置为1表示在y轴方向上进行边缘检测。如图7-18所示,一共有四个子图,子图a是原始图像,子图b对y轴方向取导,仅在y轴方向的边缘会被忽略,子图c对x轴方向取导,仅在x轴方向的边缘会被忽略,子图d对x轴和y轴两个方向同时取导,在x轴和y轴方向的边缘都会被忽略。
img=cv2.imread("../picture/sobel.jpeg")
gray_img=cv2.cvtcolor(img, cv2.color_rgb2gray)
#sobel边缘检测
sobel01 = cv2.sobel(gray_img,cv2.cv_64f,0,1)
#对二值图像进行反转,黑白颠倒
sobel01=cv2.bitwise_not(sobel01)
#sobel边缘检测
sobel10 = cv2.sobel(gray_img,cv2.cv_64f,1,0)
#对二值图像进行反转,黑白颠倒
sobel10=cv2.bitwise_not(sobel10)
#sobel边缘检测
sobel11 = cv2.sobel(gray_img,cv2.cv_64f,1,1)
#对二值图像进行反转,黑白颠倒
sobel11=cv2.bitwise_not(sobel11)
图7-18 soble边缘检测示例(二)