计算机视觉入门(三)

文章目录

  • 图像轮廓的检测
  • 模板匹配
  • 适应窗口大小显示图片
  • 图像金字塔
  • 拉普拉斯金字塔

图像轮廓的检测

  • 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('tree.png', 0)
#转灰度图

#img = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
# plt.imshow(img)
# plt.show()
# cv2.cv_show(img,'thresh')

#图像阈值(二值处理)
ret,thresh=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# plt.imshow(thresh)
# plt.show()
# #绘制轮廓
contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#正确python代码
#轮廓匹配
img=cv.imread('tree.jpg')
#缩小图片
img=cv.resize(img,None,fx=0.2,fy=0.2)
#转为灰度图
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#二值变换
ret,thresh=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#显示
#cv.imshow('thresh',thresh)
#轮廓检测函数
contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#轮廓信息
#print(contours)
#层级
#hierarchy
#绘制轮廓
#传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度
#需要copy,要不原图会变
draw_img=img.copy()
#-1画所有轮廓 
res=cv2.drawContours(draw_img,contours,-1,(255,0,0),1)
cv.imshow('res',res)
# # # 等待按下任意键
cv.waitKey(0)
# # # 释放内存
cv.destroyAllWindows()

计算机视觉入门(三)_第1张图片

模板匹配

  • TM_SQDIFF 判断 minVal 越小,效果越好
    计算模板与目标图像的方差,由于是像素值差值的平方的和,所以值越小匹配程度越高;

  • TM_SQDIFF_NORMED 判断 minVal 越接近0,效果越好

  • 范化的TM_SQDIFF,取值为0-1之间,完美匹配返回值为0;

  • TM_CCORR 判断 maxVal 越大,效果越好
    使用dot product计算匹配度,越高匹配度就好;

  • TM_CCORR_NORMED 判断 maxVal 越接近1,效果越好

  • 范化的TM_CCORR,0-1之间,我用的这个;

  • TM_CCOEFF 判断 maxVal 越大,效果越好
    采用模板与目标图像像素与各自图像的平均值计算dot product,正值越大匹配度越高,负值越大图像的区别越大,但如果图像没有明显的特征(即图像中的像素值与平均值接近)则返回值越接近0;

  • TM_CCOEFF_NORMED 判断 maxVal 越接近1,效果越好

  • 范化的cv::TM_CCOEFF,-1 ~ 1之间。计算归一化相关系数。
    cv2.matchTemplate(src, template, method)

     参数:
    
             src: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]
    
             template: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
    
             method: 掩模图像。统整幅图像的直方图就把它为 None。但是如 果你想统图像某一分的直方图的你就制作一个掩模图像并使用它。
    
     作用:用于生成图像的频数直方图 
    

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(ret)

    参数: min_val, max_val, min_loc, max_loc 分别表示最小值,最大值,即对应的位置, ret输入的矩阵

    作用:找出矩阵中最大值和最小值,即其对应的(x, y)的位置

cv2.rectangle(img, (x, y), (x+w. y+h), (0, 0, 255), 2)

    参数:

            img: 表示图片

            (x, y): 表示矩阵左上角的位置

            (x+w. y+h): 表示矩阵右下角的位置

            (0, 0, 255):表示颜色

            2:表示线条  

    作用:用于在图像上画出矩阵

计算机视觉入门(三)_第2张图片
计算机视觉入门(三)_第3张图片

img = cv.imread('cat.jpg')
#读入匹配模板
Template=cv.imread('careye.jpg')
#获取模板的高和宽
h,w=Template.shape[:2]
#使用匹配函数
method = cv2.TM_SQDIFF_NORMED
res = cv2.matchTemplate(img, Template, method)
#使用函数
min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(res)
#method=['cv2.TM_CCOEFF','cv2.TM_CCOEFF_NORMED','cv2.TM_CCORR','cv2.TM_CCORR_NORMED','cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED']
#在原图画出矩形框
ret = cv2.rectangle(img, min_loc, (min_loc[0] + w, min_loc[1] + h), 255, 10)
img = cv.resize(img, None, fx=0.2, fy=0.2)
cv.imshow('img',img)
# # # 等待按下任意键
cv.waitKey(0)
# # 释放内存
cv.destroyAllWindows()

计算机视觉入门(三)_第4张图片
使用循环显示多组

#If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
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(img,top_left, bottom_right, (0,0,255), 2)
img = cv.resize(img, None, fx=0.2, fy=0.2)
cv2.imshow('img',img)


if cv2.waitKey(0) & 0xFF == ord('q'):
    cv2.destroyAllWindows

适应窗口大小显示图片

# 导入相关模块和包
import cv2 as cv

# 读取图片

img= cv.imread('dog.jpg')
# 创建一个窗口 并设置为自动调整大小
img = cv.resize(img, None, fx=0.5, fy=0.5)
#设置完尺寸后再显示
cv.imshow('img', img)
#cv.namedWindow的功能是将图片完整显示出来
#cv.namedWindow('cartoon window', 0)
# # 展示窗口 展示所读图片
# cv.imshow('cartoon window', src)
# # 把图片转为灰度图
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# # 展示灰度图
cv.imshow('gray image', gray)
# # 等待按下任意键
cv.waitKey(0)
# 释放内存
cv.destroyAllWindows()

计算机视觉入门(三)_第5张图片

图像金字塔

计算机视觉入门(三)_第6张图片

拉普拉斯金字塔

计算机视觉入门(三)_第7张图片

#拉普拉斯金字塔
down=cv2.pyrDown(img)
# cv.imshow('d',down)
down_up=cv2.pyrUp(down)
det=img-down_up
cv.imshow('det',det)

你可能感兴趣的:(Python计算机视觉,计算机视觉,opencv,python)