OpenCV-图像特征提取方法

"""
特征提取方法:1. 基于结构形态的特征提取; 2. 基于几何分布的特征提取
基于结构形态的特征提取主要是将图像的结构形态转化为特征向量,主要包括边界特征法、傅立叶特征算子法、形状不变矩法以及几何参数法
"""

"""
边界特征法主要关注图像边界部分的特征,主要包括霍夫变换法和边界方向直方图法
霍夫变换:原始坐标系下的一个点对应于参数坐标的一条线,将原始坐标下的各点投影到参数坐标后,会发现有聚集的点,这些聚集的点构成原始坐标下的直线
边界方向直方图:首先利用常见的边缘检测算子求图像边缘,再作出关于边缘大小和方向的直方图
"""

# 霍夫变换
import cv2
import numpy as np

im = cv2.imread('hough.png')
edges = cv2.Canny(im, 50, 150, apertureSize=3)
result = im.copy()
minLineLength = 10
maxLinegap = 30
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 200, minLineLength, maxLinegap)
for x1, y1, x2, y2 in lines[0]:
    cv2.line(result, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imshow('result', result)

"""
常用的边缘检测算子有Laplacian, Sobel, Prewitt, Canny等,它们通过差分的方式来近似图像像素偏导数的值
Laplacian: n维欧几里得空间中的一个二阶微分算子;
Sobel: 一阶微分算子,利用单个像素邻近区域的剃度值来计算该像素的剃度值,然后根据一定的规则进行取舍,使用3x3的模版
Prewitt: 一阶微分算子,使用3x3的模板
Canny: 包括4个步骤
       1)用高斯滤波器对图像进行平滑处理
       2)用一阶偏导的有限差分来计算剃度的幅值和方向
       3)对梯度的幅值进行非极大值抑制
       4)用双阈值算法检测和连接图像的边缘

"""


# Laplacian
image = cv2.imread('lena.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
lap = cv2.Laplacian(image, cv2.CV_64F)
lap = np.uint8(np.absolute(lap))
cv2.imshow('Laplacian', lap)

# Sobel
image = cv2.imread('lena.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
sobelX = cv2.Sobel(image, cv2.CV_64F, 1, 0)
sobelX = np.uint8(np.absolute(sobelX))
sobelY = cv2.Sobel(image, cv2.CV_64F, 0, 1)
sobelY = np.uint8(np.absolute(sobelY))

combined = cv2.bitwise_or(sobelX, sobelY)
cv2.imshow('combined', combined)

# Prewitt
import numpy as np
import matplotlib.pyplot as plt
import cv2
from scipy import signal

kernel_x = np.array([[-1, 0, 1],
                     [0, 0, 0],
                     [-1, 0, 1]])

kernel_y = np.array([[-1, -1, -1],
                     [0, 0, 0],
                     [1, 1, 1]])

image = cv2.imread('lena.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image_x = signal.convolve2d(image, kernel_x)
image_y = signal.convolve2d(image, kernel_y)
image_xy = np.sqrt(image_x**2, image_y**2)
image_xy = (255.0/image_xy.max()) * image_xy
cv2.imshow('image_xy', image_xy)

# Canny
image = cv2.imread('lena.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(image, 30, 150)
cv2.imshow('canny', canny)

# 傅立叶特征算子
img = cv2.imshow('fuliye.jpg', 0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift))
cv2.imshow('center.jpg', magnitude_spectrum)

# 形状不变矩
import cv2
import numpy as np
np.set_printoptions(suppress=True)


def my_humoments(img_gray):
    moments = cv2.moments(img_gray)
    humoments = cv2.HuMoments(moments)
    humoments = np.log(np.abs(humoments))
    print(humoments)


if __name__ == '__main__':
    img = cv2.imread('lena.jpg')
    h, w, _ = img.shape[:]
    # 旋转
    img = cv2.resize(img, (h//2, w//2), cv2.INTER_LINEAR)
    M = cv2.getRotationMatrix2D((w//2, h//2), 5, 1.0)
    img = cv2.warpAffine(img, M, (w, h))
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 镜像
    img = cv2.flip(img, 0, dst=None)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    


你可能感兴趣的:(OpenCV)