CV Python - 2

1.  边缘检测
Sobel算子
# 要使用16位有符号的数据类型,即cv2.CV_16S,dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、12x = 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))
 

猜你喜欢

转载自blog.csdn.net/francislucien2017/article/details/80174017