#读入数据
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()
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:表示线条
作用:用于在图像上画出矩阵
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()
#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()
#拉普拉斯金字塔
down=cv2.pyrDown(img)
# cv.imshow('d',down)
down_up=cv2.pyrUp(down)
det=img-down_up
cv.imshow('det',det)