Opencv学习笔记(四)-----图像金字塔、图像轮廓、图像近似

Opencv学习笔记(四)-----图像金字塔、图像轮廓、图像近似

  • 前言
  • 一、图像金字塔
    • 1.高斯金字塔
      • 1.1向下采样法
      • 1.2向上采样法
      • 1.3原图及两种采样方法对比
    • 2.拉普拉斯金字塔:
  • 二、图像轮廓
  • 三、图像近似
  • 四、图像边界
  • 总结


前言

本文介绍了图像金字塔、图像轮廓、图像近似的操作方法、代码例程,操作后和原图的对比图。

一、图像金字塔

做图像特征提取有时不光对原始图像进行处理,可能对金字塔的每层图像进行处理,每层图像的特征提取出来的结果都可能不同,有时对提取出来的所有特征进行整合,得出的结果效果会更好;Opencv学习笔记(四)-----图像金字塔、图像轮廓、图像近似_第1张图片

1.高斯金字塔

1.1向下采样法

图象越采样越小,由上图看则采样方向为从下到上
Opencv学习笔记(四)-----图像金字塔、图像轮廓、图像近似_第2张图片

1.2向上采样法

图象越采样越大,由上图看则采样方向为从上到下;
Opencv学习笔记(四)-----图像金字塔、图像轮廓、图像近似_第3张图片

1.3原图及两种采样方法对比

原图、上采样、下采样、先上后下采样在530*530的图片中对比明显,可以看出图像的变化;把图像放大,对比清晰度,也可看出图片的清晰度也有明显变化;

# -*- coding: utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('lena.png',0)
#上采样
up = cv2.pyrUp(img)
#下采样
down = cv2.pyrDown(img)
# 先上采样再下采样:和原图已经有差异,因为上采样会丢失眸子额像素点,再下采样再丢失某些点,最后虽然得到的图像和原图像大小相同但已经比原图模糊
up_down= cv2.pyrDown(up)
#几种采样方式显示对比图
plt.subplot(221), plt.imshow(img, cmap='gray')
plt.title('img')
plt.xlim([0,530]),plt.ylim([530,0])
plt.subplot(222), plt.imshow(up, cmap='gray')
plt.title('up')
plt.xlim([0,530]),plt.ylim([530,0])
plt.subplot(223), plt.imshow(down, cmap='gray')
plt.title('down')
plt.xlim([0,530]),plt.ylim([530,0])
plt.subplot(224), plt.imshow(up_down, cmap='gray')
plt.title('up_down')
plt.xlim([0,530]),plt.ylim([530,0])
plt.savefig('Gaussian.png')
plt.show()

Opencv学习笔记(四)-----图像金字塔、图像轮廓、图像近似_第4张图片
Opencv学习笔记(四)-----图像金字塔、图像轮廓、图像近似_第5张图片

2.拉普拉斯金字塔:

拉普拉斯金字塔=原图像-先下采样再后上采样的图像;
可进行多级处理,多级处理时后级输入的图像是前一级处理过后的图像;
Opencv学习笔记(四)-----图像金字塔、图像轮廓、图像近似_第6张图片
一级拉普拉斯金字塔处理后与原图对比图

# -*- coding: utf-8 -*-
import numpy as np
import cv2

#拉普拉斯金字塔=原图像-先下采样后上采样的图像
def cv_show(img,name,writename):
    cv2.imshow(name,img)
    cv2.imwrite(writename,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
img = cv2.imread('lena.png')
down = cv2.pyrDown(img)
down_up = cv2.pyrUp(down)
Laplace = img - down_up
res = np.hstack((img,Laplace))
cv_show(res,'res','Laplace.png')#

Opencv学习笔记(四)-----图像金字塔、图像轮廓、图像近似_第7张图片

二、图像轮廓

  • cv2.findContours(img,mode,method)

    img:要处理的3通道图片

    mode:轮廓检索模式

    method:轮廓逼近方法

  • cv2.drawContours(image, contours, contourIdx, color,thickness)

    image:要绘制轮廓的图像,要为3通道图像才可绘制轮廓;

    contours:指轮廓本身,若图片中有多个图形,绘制第一个图形轮廓则取contours[0],以此类推;若不指定绘制的图形轮廓则全部所有图形都绘制;

    contourIdx:指轮廓中的哪种轮廓,-1为所有轮廓;0为外轮廓,1为内轮廓;

    color:绘制轮廓线的BGR颜色,如用红色则(0,0,255);

    thickness:轮廓线宽度;

# -*- coding: utf-8 -*-
import numpy as np
import cv2

def cv_show(img,name,writename):#
    cv2.imshow(name,img)
    cv2.imwrite(writename,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
#读取3通道图片
img = cv2.imread('contours.png')
#灰度图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#对灰度图二值化
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#绘制图像轮廓
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度
#注意需要copy原图,因为处理的时候会修改原图
draw_img = img.copy()
# 绘制第一个图形,外轮廓线,线宽为2,轮廓线颜色为红色
res1 = cv2.drawContours(draw_img,contours[0],-1,(0,0,255),2)
res = np.hstack((img,res1))
cv_show(res,'res','res1.png')

Opencv学习笔记(四)-----图像金字塔、图像轮廓、图像近似_第8张图片

三、图像近似

原图以及两个不同参数(0.1和0.01)的轮廓近似对比图

# -*- coding: utf-8 -*-
import numpy as np
import cv2
def cv_show(img,name,writename):#
    cv2.imshow(name,img)
    cv2.imwrite(writename,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
#读取3通道图片
img = cv2.imread('contours2.png')
#灰度图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#对灰度图二值化
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#绘制图像轮廓
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#取第一个轮廓结果
cnt = contours[0]
# 近似轮廓
# 参数越小近似轮廓越接近
esiplon1 = 0.1*cv2.arcLength(cnt,True)
approx1 = cv2.approxPolyDP(cnt,esiplon1,True)
draw_img1 = img.copy()
res1 = cv2.drawContours(draw_img1,[approx1],-1,(0,0,255),2)

#参数越小近似轮廓越接近
esiplon2 = 0.01*cv2.arcLength(cnt,True)
approx2= cv2.approxPolyDP(cnt,esiplon2,True)
draw_img2= img.copy()
res2 = cv2.drawContours(draw_img2,[approx2],-1,(0,0,255),2)

res = np.hstack((img,res1,res2))
cv_show(res,'res','contours2233.png')

Opencv学习笔记(四)-----图像金字塔、图像轮廓、图像近似_第9张图片

四、图像边界

这里用边界矩形和边界外接圆为例;

第一步:读取3通道图片进行灰度处理,再进行二值化滤除其他噪音;

第二步:绘制图像轮廓;

第三步:获取图像轮廓的坐标以及尺寸数据;

第四步:选择绘制的形状根据第三部数据绘制相应图形;

# -*- coding: utf-8 -*-
import numpy as np
import cv2

def cv_show(img, name, writename):  #
    cv2.imshow(name, img)
    cv2.imwrite(writename, img)
    cv2.waitKey()
    cv2.destroyAllWindows()
# 读取图片
img = cv2.imread('contours.png')
# 灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 对灰度图二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 绘制图像轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 取第三个轮廓结果
cnt = contours[3]
# 边界矩形轮廓函数
# 可根据得到的数据绘制出边界矩形
x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

#外接圆
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
#画圆函数
img2 = cv2.circle(img,center,radius,(0,0,255),2)
cv_show(img2,'img2','img2.png')

Opencv学习笔记(四)-----图像金字塔、图像轮廓、图像近似_第10张图片

总结

小白在学习OpenCV过程中的学习笔记,若有不对之处请指正。

你可能感兴趣的:(opencv,opencv,计算机视觉,图像识别,边缘检测)