scikit-image是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,是非常好的数字图像处理工具。
首先需要安装scikit-image库:
pip install scikit-image
sobel算子
from skimage import io,filters,img_as_ubyte
import matplotlib.pyplot as plt
# 图像读取
img = io.imread('./2290.jpg', as_gray=True)
io.imshow(img)
io.show()
# sobel边缘检测
edges = filters.sobel(img)
# 浮点型转成uint8型
edges = img_as_ubyte(edges)
# 显示图像
plt.imshow(edges, plt.cm.gray)
plt.show()
# 保存图像
io.imsave('./2290_sobel.jpg', edges)
# sobel 水平方向边缘检测
edgesh = filters.sobel_h(img)
edgesh = img_as_ubyte(edgesh)
plt.imshow(edgesh, plt.cm.gray)
plt.show()
io.imsave('./2290_sobel_h.jpg', edges)
# sobel 竖直方向边缘检测
edgesv = filters.sobel_v(img)
edgesv = img_as_ubyte(edgesv)
plt.imshow(edgesv, plt.cm.gray)
plt.show()
io.imsave('./2290_sobel_v.jpg', edges)
prewitt算子
调用格式同sobel:
edges = filters.prewitt(img)
edges = filters.prewitt_h(img) # 水平方向边缘检测
edges = filters.prewitt_v(img) # 垂直方向边缘检测
roberts算子
调用格式同sobel:
edges = filters.roberts(img)
canny算子
canny算子不是放在filters模块,而是放在feature模块
from skimage import feature
edges = feature.canny(image,sigma=1.0) # sigma越小,边缘线条越细小
现对某一文件夹下的所有图片进行边缘检测并保存图片:
import os
from skimage import io,filters,img_as_ubyte
# sobel边缘检测
def Sobel(path, name):
img = io.imread(path, as_gray=True)
edges = filters.sobel(img)
edges = img_as_ubyte(edges) # 浮点型转成uint8型
io.imsave('/home/jiao/zuan_sobel/' + name + '.jpg', edges)
if __name__ == '__main__':
img_path = '/home/jiao/zuan'
for img in os.listdir(img_path):
img_name = os.path.splitext(img)
img_destfile = img_path + '/' + img_name[0] + img_name[1]
out = Sobel(img_destfile, img_name[0])