1. 边缘检测
Sobel算子
# 要使用16位有符号的数据类型,即cv2.CV_16S,dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2。 x = cv2.Sobel(img, cv2.CV_16S, 1, 0) y = cv2.Sobel(img, cv2.CV_16S, 0, 1)
# convertScaleAbs()函数将其转回原来的uint8形式 absX = cv2.convertScaleAbs(x) # 水平 absY = cv2.convertScaleAbs(y) # 垂直
# 用cv2.addWeighted(...)函数将其组合起来。 dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
from skimage import filters edges = filters.sobel(img)
edges1 = filters.sobel_h(img) # 水平 edges2 = filters.sobel_v(img) # 垂直
Canny算子
# 上下阈值
canny= cv2.Canny(img, 50,150)
# sigma越小, 检测越细
from skimage import feature edges1 = feature.canny(img) edges2 = feature.canny(img, sigma=3)
2. 连通域分析&绘制外接矩形
label_image =skimage.measure.label(tmp1,connectivity=2)
for region in skimage.measure.regionprops(label_image): if region.area < 500: continue # 绘制外包矩形 minr, minc, maxr, maxc = region.bbox rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr, fill=False, edgecolor='red', linewidth=2) ax1.add_patch(rect) # ax1为plt图像
3. 常用操作
# 直方图均衡化 img = cv2.equalizeHist(img)
# 二值化
ret,binary = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# 查找轮廓 image, contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
ct = contours[i]
area = cv2.contourArea(ct) # 计算该轮廓的面积
# Otsu's threshold 根据灰度作二值图像
import mahotas T = mahotas.thresholding.otsu(Grayimg)
#最大类间方差法求阈值,T为阈值
thresh = Grayimg.copy() thresh[thresh >T] = 255 thresh[thresh < 255] = 0
4. 滤波去噪
# 高斯滤波,sigma越大越模糊
from skimage import filters
gaussian = filters.gaussian(img,sigma=5)
# 中值滤波,用skimage.morphology模块来设置滤波器的形状
from skimage.morphology import disk edges1 = filters.median(img,disk(5))
from PIL import ImageFilter
# 模糊滤波 blur = im.filter(ImageFilter.BLUR)
# 轮廓滤波,将图像中的轮廓信息全部提取出来
contour = im.filter(ImageFilter.CONTOUR)
# 边缘增强滤波
edge_enhance = im.filter(ImageFilter.EDGE_ENHANCE)
# 深度边缘增强滤波
edge_enhance_more = m.filter(ImageFilter.EDGE_ENHANCE_MORE)
# 浮雕滤波
emboss = im.filter(ImageFilter.EMBOSS)
# 锐化滤波
sharpen = im.filter(ImageFilter.SHARPEN)
# 从(size,size)的区域中拷贝最小的像素值存储到输出图像中
min = im.filter(ImageFilter.MinFilter(3))
# 从(size,size)的区域中拷贝中间的像素值存储到输出图像中
median = im.filter(ImageFilter.MedianFilter(5))