opencv python简易文档之图像处理算法

目录
  • 将图片转为灰度图
  • HSV
  • 图像阈值
  • 图像平滑
  • 形态学-腐蚀操作
  • 形态学-膨胀操作
  • 开运算与闭运算
  • 梯度运算
  • 礼帽与黑帽
  • 图像梯度处理
  • Canny边缘检测
  • 图像金字塔
  • 图像轮廓
  • 直方图
  • 直方图均衡化:
  • 自适应均衡化:
  • 傅里叶变换
  • 模板匹配
  • 总结

上一篇已经给大家介绍了opencv python图片基本操作的相关内容,这里继续介绍图像处理算法,下面来一起看看吧

将图片转为灰度图

import cv2 #opencv读取的格式是BGR
img=cv2.imread('cat.jpg')
# 将图片转为灰度图像操作
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img_gray.shape

HSV

H - 色调(主波长)。

S - 饱和度(纯度/颜色的阴影)。

V值(强度)

import cv2
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow("hsv", hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像阈值

ret, dst = cv2.threshold(src, thresh, maxval, type)

src: 输入图,只能输入单通道图像,通常来说为灰度图

dst: 输出图

thresh: 阈值

maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值

type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0

cv2.THRESH_BINARY_INV THRESH_BINARY的反转

cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变

cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0

cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转

ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)

titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

图像平滑

使用均值滤波实现图像平滑

# 均值滤波
# 简单的平均卷积操作
# 使用3*3的卷积和
blur = cv2.blur(img, (3, 3))

cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用方框滤波实现图像平滑:

# 方框滤波
# 基本和均值一样,可以选择归一化
box = cv2.boxFilter(img,-1,(3,3), normalize=True)  

cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 方框滤波
# 基本和均值一样,可以选择归一化,容易越界,越界后值为255
box = cv2.boxFilter(img,-1,(3,3), normalize=False)  

cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用高斯滤波实现图像平滑:

# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视距离
aussian = cv2.GaussianBlur(img, (5, 5), 1)  

cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用中值滤波实现图像平滑:

# 中值滤波
# 相当于用中值代替
median = cv2.medianBlur(img, 5)  # 中值滤波

cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用np将所有处理图片拼接显示:

# 展示所有的
res = np.hstack((blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

形态学-腐蚀操作

腐蚀操作可以用于去除图像中的毛刺

# iterations为腐蚀操作的迭代次数
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)

cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

形态学-膨胀操作

膨胀操作通常与腐蚀操作配合使用

# 先对图像进行腐蚀操作去除干扰信息
# kernel 为卷积核大小
kernel = np.ones((3,3),np.uint8)
dige_erosion = cv2.erode(img,kernel,iterations = 1)

cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 对图像进行膨胀操作将干扰信息以外的腐蚀部分复原
kernel = np.ones((3,3),np.uint8)
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)

cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

开运算与闭运算

开运算:先腐蚀,再膨胀

闭运算:先膨胀,再腐蚀

# 开:先腐蚀,再膨胀
img = cv2.imread('dige.png')

kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 闭:先膨胀,再腐蚀
img = cv2.imread('dige.png')

kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

梯度运算

提取图片边缘信息

# 梯度=膨胀-腐蚀
pie = cv2.imread('pie.png')
kernel = np.ones((7,7),np.uint8)
dilate = cv2.dilate(pie,kernel,iterations = 5)
erosion = cv2.erode(pie,kernel,iterations = 5)

res = np.hstack((dilate,erosion))

cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)

cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

礼帽与黑帽

礼帽 = 原始输入-开运算结果

黑帽 = 闭运算-原始输入

#礼帽
img = cv2.imread('dige.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
#黑帽
img = cv2.imread('dige.png')
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()

图像梯度处理

通过像素差异提取图片边缘

Sobel算子

Scharr算子

laplacian算子

对于梯度更敏感

检测图像像素梯度变换GX为水平梯度检测,GY为垂直梯度检测。GX与GY相当于前面提到的卷积和。

dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
# ddepth:图像的深度
# dx和dy分别表示水平和竖直方向
# ksize是Sobel算子的大小
# 在opencv中像素小于0的点直接被认为是0
# 计算GX
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
# 将负数部分转为正数
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx,'sobelx')
# 计算GY
sobelx = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
# 将负数部分转为正数
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx,'sobelx')
# 计算GX与GY的加和
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,'sobelxy')

不同算子之间的差异

#不同算子的差异
img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.convertScaleAbs(sobely)
sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  

scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0) 

laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)   

res = np.hstack((sobelxy,scharrxy,laplacian))
cv_show(res,'res')

Canny边缘检测

使用高斯滤波器,以平滑图像,滤除噪声。

计算图像中每个像素点的梯度强度和方向。

应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。

应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。

通过抑制孤立的弱边缘最终完成边缘检测。

1:高斯滤波器

卷积核为符合高斯分布的数据,主要将图像平滑。

2:梯度和方向

3:非极大值抑制

4:双阈值检测

img=cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)

v1=cv2.Canny(img,80,150)
v2=cv2.Canny(img,50,100)

res = np.hstack((v1,v2))
cv_show(res,'res')

图像金字塔

高斯金字塔

拉普拉斯金字塔

主要用于特征提取

高斯金字塔:向下采样方法(缩小)

高斯金字塔:向上采样方法(放大)

# 向上变换
up=cv2.pyrUp(img)
# 向下变换
down=cv2.pyrDown(img)

拉普拉斯金字塔

down=cv2.pyrDown(img)
down_up=cv2.pyrUp(down)
l_1=img-down_up
cv_show(l_1,'l_1')

图像轮廓

cv2.findContours(img,mode,method)

mode:轮廓检索模式

RETR_EXTERNAL :只检索最外面的轮廓;

RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;

RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;

RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;

method:轮廓逼近方法

CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。

CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。

img = cv2.imread('contours.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv_show(thresh,'thresh')
# 提取轮廓
binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 绘制轮廓
#传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度
# 注意需要copy,要不原图会变。。。
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
cv_show(res,'res')

轮廓特征

# 选取轮廓     0表示第一个轮廓
cnt = contours[0]
#面积
cv2.contourArea(cnt)
#周长,True表示闭合的
cv2.arcLength(cnt,True)

轮廓近似

epsilon = 0.15*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)

draw_img = img.copy()
res = cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2)
cv_show(res,'res')
# 外接矩形
img = cv2.imread('contours.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[0]

x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv_show(img,'img')
# 外接圆
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img,center,radius,(0,255,0),2)
cv_show(img,'img')

直方图

用于统计图片像素值分布,x轴表示像素值(0-255),y轴表示该像素值对应个数。

cv2.calcHist(images,channels,mask,histSize,ranges)

images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]

channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。

mask: 掩模图像。统整幅图像的直方图就把它为 None。但是如 果你想统图像某一分的直方图的你就制作一个掩模图像并 使用它。

histSize:BIN 的数目。也应用中括号括来

ranges: 像素值范围常为 [0256]

# 统计灰度图的直方图
img = cv2.imread('cat.jpg',0) #0表示灰度图
hist = cv2.calcHist([img],[0],None,[256],[0,256])
hist.shape
# 统计三通道直方图
img = cv2.imread('cat.jpg')
color = ('b','g','r')
for i,col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])

mask操作:

# 创建mask
mask = np.zeros(img.shape[:2], np.uint8)
print (mask.shape)
mask[100:300, 100:400] = 255
cv_show(mask,'mask')
# 将mask与图像融合
masked_img = cv2.bitwise_and(img, img, mask=mask)#与操作
cv_show(masked_img,'masked_img')
# 使用mask进行直方图统计与非mask进行直方图统计
hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])

直方图均衡化:

是图像像素分布更加均匀。

# 直方图均衡化
equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)
plt.show()

自适应均衡化:

通过将图片划分为局部图片,然后进行直方图均衡化处理。

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))

傅里叶变换

时域-》频域

傅里叶变换的作用

高频:变化剧烈的灰度分量,例如边界

低频:变化缓慢的灰度分量,例如一片大海

滤波

低通滤波器:只保留低频,会使得图像模糊,相当于对于边界的处理。

高通滤波器:只保留高频,会使得图像细节增强,相当于对于非边界的处理。

opencv中主要就是cv2.dft()和cv2.idft(),输入图像需要先转换成np.float32 格式。

得到的结果中频率为0的部分会在左上角,通常要转换到中心位置,可以通过shift变换来实现。

cv2.dft()返回的结果是双通道的(实部,虚部),通常还需要转换成图像格式才能展示(0,255)。

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('lena.jpg',0)

img_float32 = np.float32(img)

dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 得到灰度图能表示的形式
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))

plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
# 低频滤波
import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('lena.jpg',0)

img_float32 = np.float32(img)

dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)

rows, cols = img.shape
crow, ccol = int(rows/2) , int(cols/2)     # 中心位置

# 低通滤波
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1

# IDFT
fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])

plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])

plt.show()

结果(低通对边界值不友好)

# 高频滤波
img = cv2.imread('lena.jpg',0)

img_float32 = np.float32(img)

dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)

rows, cols = img.shape
crow, ccol = int(rows/2) , int(cols/2)     # 中心位置

# 高通滤波
mask = np.ones((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 0

# IDFT
fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])

plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])

plt.show()

结果(高通对非边界值不友好)

模板匹配

模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,这个差别程度的计算方法在opencv里有6种,然后将每次计算的结果放入一个矩阵里,作为结果输出。假如原图形是AxB大小,而模板是axb大小,则输出结果的矩阵是(A-a+1)x(B-b+1)

# 模板匹配
img = cv2.imread('lena.jpg', 0)
template = cv2.imread('face.jpg', 0)
h, w = template.shape[:2]

TM_SQDIFF:计算平方不同,计算出来的值越小,越相关

TM_CCORR:计算相关性,计算出来的值越大,越相关

TM_CCOEFF:计算相关系数,计算出来的值越大,越相关

TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关

TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关

TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关

methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
           'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
for meth in methods:
    img2 = img.copy()

    # 匹配方法的真值
    method = eval(meth)
    print (method)
    res = cv2.matchTemplate(img, template, method)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    # 如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值
    if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)

    # 画矩形
    cv2.rectangle(img2, top_left, bottom_right, 255, 2)

    plt.subplot(121), plt.imshow(res, cmap='gray')
    plt.xticks([]), plt.yticks([])  # 隐藏坐标轴
    plt.subplot(122), plt.imshow(img2, cmap='gray')
    plt.xticks([]), plt.yticks([])
    plt.suptitle(meth)
    plt.show()

总结

到此这篇关于opencv python简易文档之图像处理算法的文章就介绍到这了,更多相关opencv python图像处理算法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • OpenCV-Python使用分水岭算法实现图像的分割与提取

    随着当今世界的发展,计算机视觉技术的应用越来越广泛.伴随着硬件设备的不断升级,构造复杂的计算机视觉应用变得越来越容易了.OpenCV像是一个黑盒,让我们专注于视觉应用的开发,而不必过多的关注基础图象处理的具体细节. 图像分割 了解分水岭算法之前,我们需要了解什么是图像的分割. 在图像的处理过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆,行人或者其他对象.我们希望将这些对象从视

  • OpenCV-Python实现人脸磨皮算法

    人脸磨皮是最基础的人脸美颜效果.主要分为祛斑,祛痘,淡化黑眼圈等步骤.通过前面的学习相信大家一眼都看得出来我们需要干什么才能识别人脸磨皮效果. 因为磨皮之后,脸部的杂质基本上就没有了,也可以说丢失了细节.那么肯定需要用到滤波函数.滤波的过程就是把图像的每一个像素值输入过滤器,得到平滑的图像. 而我们常用的滤波有均值滤波,高斯滤波以及双边滤波三种,到底选用那种滤波呢? 首先,均值滤波会因为是用周围像素的平均值代替原像素值,肯定会导致图像过于模糊,所以排除掉.其次,高斯滤波与均值滤波原理类似,只是高

  • python opencv之分水岭算法示例

    本文介绍了python opencv之分水岭算法示例,分享给大家,具体如下: 目标 使用分水岭算法对基于标记的图像进行分割 使用函数cv2.watershed() 原理: 灰度图像可以被看成拓扑平面,灰度值高的区域可以看出山峰,灰度值低的区域可以看成是山谷.向每一个山谷当中灌不同颜色的水.水位升高,不同山谷的水会汇合,为防止不同山谷的水汇合,小在汇合处建立起堤坝.然后继续灌水,然后再建立堤坝,直到山峰都掩模.构建好的堤坝就是图像的分割. 此方法通常会得到过渡分割的结果,因为图像中的噪声以及其他因

  • python opencv 简单阈值算法的实现

    本文先了解一个简单阈值函数,以了解一个阈值算法的具体参数. 然后比较不同阈值函数的区别. 同样的,先用一副图说明本文重要大纲: #! usr/bin/env python # coding: utf-8 import cv2 img = cv2.imread('cat.jpg') img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 先将图像矩阵进行二值化 # img = cv2.imread('cat.jpg',0) # 也可以直接将图像用灰度值读入,其中0

  • python opencv之SURF算法示例

    本文介绍了python opencv之SURF算法示例,分享给大家,具体如下: 目标: SURF算法基础 opencv总SURF算法的使用 原理: 上节课使用了SIFT算法,当时这种算法效率不高,需要更快速的算法.在06年有人提出了SURF算法"加速稳定特征",从名字上来看,他是SIFT算法的加速版本. (原文) 在SIFT算法当中使用高斯差分方程(Difference of Gaussian)对高斯拉普拉斯方程( Laplacian of Gaussian)进行近似.然而,SURF使

  • Python基于opencv的图像压缩算法实例分析

    本文实例讲述了Python基于opencv的图像压缩算法.分享给大家供大家参考,具体如下: 插值方法: CV_INTER_NN - 最近邻插值, CV_INTER_LINEAR - 双线性插值 (缺省使用) CV_INTER_AREA - 使用象素关系重采样.当图像缩小时候,该方法可以避免波纹出现.当图像放大时,类似于 CV_INTER_NN 方法.. CV_INTER_CUBIC - 立方插值. 函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小.若设定 ROI,函数将按

  • 应用OpenCV和Python进行SIFT算法的实现详解

    应用OpenCV和Python进行SIFT算法的实现 如下图为进行测试的gakki101和gakki102,分别验证基于BFmatcher.FlannBasedMatcher等的SIFT算法,对比其优劣.为体现出匹配效果对于旋转特性的优势,将图gakki101做成具有旋转特性的效果. 基于BFmatcher的SIFT实现 BFmatcher(Brute-Force Matching)暴力匹配,应用BFMatcher.knnMatch( )函数来进行核心的匹配,knnMatch(k-nearest

  • python opencv之SIFT算法示例

    本文介绍了python opencv之SIFT算法示例,分享给大家,具体如下: 目标: 学习SIFT算法的概念 学习在图像中查找SIFT关键的和描述符 原理: (原理部分自己找了不少文章,内容中有不少自己理解和整理的东西,为了方便快速理解内容和能够快速理解原理,本文尽量不使用数学公式,仅仅使用文字来描述.本文中有很多引用别人文章的内容,仅供个人记录使用,若有错误,请指正出来,万分感谢) 之前的harris算法和Shi-Tomasi 算法,由于算法原理所致,具有旋转不变性,在目标图片发生旋转时依然

  • OpenCV-Python实现人脸美白算法的实例

    人脸美白原理 人脸美白原理说透了,就是一种图像的颜色空间处理,所以我们需要通过颜色空间进行设计. 不过,我们先来参考以下PS对于图像美白的处理步骤: 首先,新建一个图层,将这个图层设置为白色 接着,将白色图层与原本图像进行alpha通道的颜色混合,这样就可以使图像整体变白. 通过PS的操作,我们大致可以知道需要创建一个与原图同等大小维度的图像,然后全部赋值为白色,然后通过图像图像加权和将两个图像叠加即可. 不过,这里明显存在很多问题,在PS中,我们虽然创建了全白色的图层,但是我们可以剪裁或者使用

  • opencv python简易文档之图像处理算法

    目录 将图片转为灰度图 HSV 图像阈值 图像平滑 形态学-腐蚀操作 形态学-膨胀操作 开运算与闭运算 梯度运算 礼帽与黑帽 图像梯度处理 Canny边缘检测 图像金字塔 图像轮廓 直方图 直方图均衡化: 自适应均衡化: 傅里叶变换 模板匹配 总结 上一篇已经给大家介绍了opencv python图片基本操作的相关内容,这里继续介绍图像处理算法,下面来一起看看吧 将图片转为灰度图 import cv2 #opencv读取的格式是BGR img=cv2.imread('cat.jpg') # 将图

  • opencv python简易文档之图片基本操作指南

    前言 最近在学习opencv,使用的是python接口.于是想着写些相关的笔记供以后参考,有不足之处希望大家指出. 使用python学习opencv需要下载opencv第三方库. 使用pip安装即可. 安装命令: pip install opencv-python pip install opencv-contrib-python(opencv的贡献库) 引入opencv import cv2 读取图片: img=cv2.imread('cat.jpg') # cat.jpg路径为相对路径 #

  • 基于Python实现简易文档格式转换器

    目录 需求分析 开发环境 引用模块 UI界面代码块 格式转换主要代码块 效果展示 最近看到市场上各种的文档格式转换软件,要么是收费.要么是有大量的广告.于是学习了一下 PyQt5 的页面操作,再加上了解 pandas 的使用方法.所以,萌生了想法写一个简单的文档格式转换应用.或者有更好的实现方式请在评论区留言,大家一起讨论学习~ 需求分析 1.将 .txt 的文本文档转换成 csv 格式文件. 2.将 .txt 的文本文档转换成 excel 格式文件. 开发环境 1.运行环境:python-3.

  • C++ OpenCV实战之文档照片转换成扫描文件

    目录 一.背景 二.基础知识 三.方案一:自动检测点 1.读取图片文件(进行了指定尺寸缩放) 2.创建直线类并计算两条直线的交点 3.图像边缘检测Canny 4.通过霍夫变换进行直线检测 5.求单应性矩阵 6.降噪和二值化 四.方案二:用户点选目标区域 1.命令行解析 2.鼠标事件 3.主函数实现 4.结果展示 五.总结 一.背景 前段时间都是基于Python的OpecCV进行一些学习和实践,但小的知识点并没有应用到实际的项目中:并且基于Python的版本的移植性.效率性都较差,在包含硬件的项目

  • 使用apiDoc实现python接口文档编写

    apiDoc的安装 npm install apidoc -g 点击官方文档 生成api的终端命令:apidoc -i 代码所在路径-o 生成文件的路径 接口文档的编写 文件的简介 project的介绍写在单独的json文件中apidoc.json: { "name": "project_name", "version": "0.1.0", "description": "who am i ,wh

  • Centos7安装FFmpeg音/视频工具简易文档

    ffmpeg是一个很强大的音视频处理工具,官网是:http://ffmpeg.org/ 官网介绍ffmpeg是:一个完整的.跨平台的解决方案,可以记录.转换和传输音频和视频.ffmpeg既可以播放视频,也提供命令行工具来处理视频,另外还有强大的视频处理库用于开发,下面是以Linux为例介绍ffmpeg的安装流程的简单的命令行对视频进行转码操作,是ffmpeg中最最简单的入门内容. Mac 安装步骤 brew tap homebrew-ffmpeg/ffmpeg brew install home

  • python对文档中元素删除,替换操作

    pthon更换文档中某元素: with open('E:\\桌面\\train.txt', 'r') as f:     lines = f.readlines() ​ with open('E:\\桌面\\1704.txt', 'a') as ff: # 此处 w 和 a,均可,反正是新建的临时文件,文件不存在时会自动创建     for line in lines:         # kv = line.strip().split(' ')         kv = line.split(

  • Python docutils文档编译过程方法解析

    docutils 的官方工具地址为:https://docutils.sourceforge.io/ 目前的更新主要是在版本和使用手册的更新上,因为 Python 使用 reStructuredText 文档格式,那么必不可少会用到 docutils 进行文档生成. 例如,我们希望将 https://docutils.sourceforge.io/ 上的文档生成成中文的手册. 首先你需要将 https://docutils.sourceforge.io/ 上面的 SVN 原代码下载到本地. 假设

  • help函数解决python所有文档信息查看

    目录 引言 1.模块文档查看 2.模块.函数文档查看 3.公共函数文档查看 引言 在python中的交互式命令行中提供了help函数来查询各个模块,或是公共函数,或是模块下的函数接口等都可以使用help函数来查看接口文档. 不过要查看这样的文档还是得有些英文功底的,包含函数.模块.变量的介绍都是通过英文来介绍的. 1.模块文档查看 打开控制台,这里使用的控制台工具是cmder,看起来比默认的cmd命令行好看的多. 比如说需要查看pandas模块的接口文档,可以使用help("pandas&quo

  • sea.js常用的api简易文档

    本文罗列了seajs常用的api和代码示例,下面话不多说,来看看详细的介绍,有需要的朋友们可以参考借鉴. 一.seajs.config alias 别名配置,配置之后可在模块中使用require调用 require('jquery'); seajs.config({ alias: { 'jquery': 'jquery/jquery/1.10.1/jquery' } }); define(function(require, exports, module) { //引用jQuery模块 var

随机推荐