In [1]:
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
def show(img):
# 判断图片的维度
img = img.astype(np.uint8)
if img.ndim == 2: # 说明是灰度图读取
plt.imshow(img, cmap='gray')
elif img.ndim == 3: # 彩色图片
img2 = cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(img2)
else:
print('不知道是什么图!')
return
plt.show()
Permitt算子¶
In [2]:
img = cv.imread("../pic/1png_add.png")
show(img)
In [3]:
kx = np.array([
[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1],
], dtype=np.float32)
ky = np.array([
[-1, -1, -1],
[0, 0, 0],
[1, 1, 1],
], dtype=np.float32)
# 竖向检测
imgX = cv.filter2D(img, cv.CV_64F, kx)
# 横向检测
imgY = cv.filter2D(img, cv.CV_64F, ky)
imgX.min()
show(np.hstack([np.abs(imgX), np.abs(imgY)]))
In [4]:
imgXY = np.sqrt( imgX**2 + imgY **2 )
show(imgXY)
imgXY = np.abs(imgX) + np.abs(imgY)
show(imgXY)
Roberts算子¶
In [5]:
kx = np.array([
[-1, 0],
[0, 1],
], dtype=np.float32)
ky = np.array([
[0, -1],
[1, 0],
], dtype=np.float32)
# 竖向检测
imgX = cv.filter2D(img, cv.CV_64F, kx)
# 横向检测
imgY = cv.filter2D(img, cv.CV_64F, ky)
imgX.min()
show(np.hstack([np.abs(imgX), np.abs(imgY)]))
In [6]:
imgXY = np.sqrt( imgX**2 + imgY **2 )
show(imgXY)
imgXY = np.abs(imgX) + np.abs(imgY)
show(imgXY)
Sobel算子¶
In [7]:
imgX = cv.Sobel(img, cv.CV_16S, 1, 0)
imgY = cv.Sobel(img, cv.CV_16S, 0, 1)
show(np.hstack([np.abs(imgX), np.abs(imgY)]))
# 这个报错将: cv.CV_16S 修改成 cv.CV_64F 就可以了
# /tmp/ipykernel_27412/1853354801.py:5: RuntimeWarning: invalid value encountered in sqrt
# imgXY = np.sqrt( imgX**2 + imgY **2 )
# /tmp/ipykernel_27412/3032038344.py:7: RuntimeWarning: invalid value encountered in cast
# img = img.astype(np.uint8)
imgXY = np.sqrt( imgX**2 + imgY **2 )
show(imgXY)
imgXY = np.abs(imgX) + np.abs(imgY)
show(imgXY.clip(0, 255))
/tmp/ipykernel_3078/2107187938.py:10: RuntimeWarning: invalid value encountered in sqrt imgXY = np.sqrt( imgX**2 + imgY **2 ) /tmp/ipykernel_3078/3032038344.py:7: RuntimeWarning: invalid value encountered in cast img = img.astype(np.uint8)
Scharr算子¶
In [8]:
imgX = cv.Scharr(img, cv.CV_64F, 1, 0)
imgY = cv.Scharr(img, cv.CV_64F, 0, 1)
show(np.hstack([np.abs(imgX), np.abs(imgY)]))
imgXY = np.abs(imgX) + np.abs(imgY)
show(imgXY.clip(0, 255))
Laplacian、LoG算子¶
In [9]:
img1 = cv.Laplacian(img, cv.CV_16S)
show(np.abs(img1))
In [10]:
# Log
img_blur = cv.GaussianBlur(img, (3, 3), 1)
img1 = cv.Laplacian(img_blur, cv.CV_64F)
show(np.abs(img1))
Canny算法¶
Canny 边缘检测算法 是 John F. Canny 于 1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的 最优算法, 最优边缘检测的三个主要评价标准是:
- 低错误率: 标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。
- 高定位性: 标识出的边缘要与图像中的实际边缘尽可能接近。
- 最小响应: 图像中的边缘只能标识一次。
In [11]:
img1 = cv.Canny(img, 20, 200)
show(img1)
In [ ]: