11边缘保留滤波(EPF)
美化图片
import cv2 as cv
def bi_demo(image):
dst = cv.bilateralFilter(image, 0, 100, 15) #第2个参数固定,第3个参数大一些,第4个参数小一些
cv.imshow("bi_demo",dst)
print("=====Hello Python=====")
src1 = cv.imread("opencv_sources/meiyan.jpg")
cv.namedWindow("image1",cv.WINDOW_AUTOSIZE)
cv.imshow("image1",src1)
bi_demo(src1)
cv.waitKey(0)
cv.destroyAllWindows()
12图像直方图
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
'''
直方图计算与显示
'''
def image_hist(image):
color = ("blue","green","red")
for i,color in enumerate(color):
hist = cv.calcHist([image],[i],None,[256],[0,256])
plt.plot(hist,color=color)
plt.xlim([0,256])
plt.show()
print("=====Hello Python=====")
src1 = cv.imread("opencv_sources/dog.jpg")
cv.namedWindow("image1",cv.WINDOW_AUTOSIZE)
cv.imshow("image1",src1)
image_hist(src1)
cv.waitKey(0)
cv.destroyAllWindows()
13直方图应用
直方图均衡化:图像增强的一个手段
import cv2 as cv
'''
直方图均衡化 能达到图像增强的效果
'''
def equalHist_demo(image):
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
dst = cv.equalizeHist(gray)
cv.imshow("equal-demo",dst)
'''
局部自适应均衡化处理
'''
def clahe_demo(image):
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
clahe = cv.createCLAHE(clipLimit=5.0,tileGridSize=(8,8))
dst = clahe.apply(gray)
cv.imshow("clahe-demo",dst)
print("=====Hello Python=====")
src = cv.imread("dst.PNG") #图片路径
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
# equalHist_demo(src)
clahe_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
直方图比较
import cv2 as cv
import numpy as np
'''
直方图均比较两张图片是否相似
'''
def create_rgb_hist(image):
# 创建一个三通道的直方图
h, w, c = image.shape
rgbHist = np.zeros([16*16*16,1],np.float32) # 红色通道bins数量16绿色通道16蓝色通道16
bsize = 256/16 # 空间的取值范围
for row in range(h):
for col in range(w):
b = image[row,col,0]
g = image[row,col,1]
r = image[row,col,2]
index = np.int(b/bsize)*16*16 + np.int(g/bsize)*16 + np.int(r/bsize)
rgbHist[np.int(index),0] = rgbHist[np.int(index),0] + 1
return rgbHist
def hist_compare(image1,image2):
hist1 = create_rgb_hist(image1)
hist2 = create_rgb_hist(image2)
match1 = cv.compareHist(hist1,hist2,cv.HISTCMP_BHATTACHARYYA) # 巴氏距离,越小越相似
match2 = cv.compareHist(hist1, hist2,cv.HISTCMP_CORREL) # 相关性比较,越大越相似
match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR) # 卡方,越大越不相似
print("巴氏距离:%s, 相关性:%s, 卡方:%s"%(match1,match2,match3))
print("=====Hello Python=====")
image1 = cv.imread("opencv_sources/lena.jpg")
image2 = cv.imread("opencv_sources/lenanoise.jpg")
cv.imshow("input image1",image1)
cv.imshow("input image2",image2)
hist_compare(image1,image2)
cv.waitKey(0)
cv.destroyAllWindows()
14直方图反向投影
应用场景:已知颜色,预先给个模型,在这个区域搜索就能发现这个颜色的目标。
import cv2 as cv
from matplotlib import pyplot as plt
'''
直方图反向影射
'''
def back_project_demo():
sample = cv.imread("opencv_sources/sample.png")
target = cv.imread("opencv_sources/target.png")
roi_hsv = cv.cvtColor(sample,cv.COLOR_BGR2HSV)
target_hsv = cv.cvtColor(target,cv.COLOR_BGR2HSV)
cv.imshow("sample",sample)
cv.imshow("target",target)
roiHist = cv.calcHist([roi_hsv],[0,1],None,[26,48],[0,180,0,256])
# 归一化0到255
cv.normalize(roiHist,roiHist,0,255,cv.NORM_MINMAX)
dst = cv.calcBackProject([target_hsv],[0,1],roiHist,[0,180,0,256],1)
cv.imshow("backProjectionDemo",dst)
'''
二维直方图的建立
'''
def hist2d_demo(image):
hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
hist = cv.calcHist([hsv],[0,1],None,[36,48],[0,180,0,256])
plt.imshow(hist,interpolation='nearest')
plt.title("2D histogram")
plt.show()
print("=====Hello Python=====")
# src1 = cv.imread("opencv_sources/lena.jpg")
# cv.namedWindow("image1",cv.WINDOW_AUTOSIZE)
# #cv.imshow("image1",src1)
back_project_demo()
# hist2d_demo(src1)
cv.waitKey(0)
cv.destroyAllWindows()
15模板匹配
模板匹配是模式识别里的最简单的识别方法,是在图像上找到匹配区域,发现与给定子图像匹配的小块区域,所以首先要有一个模板图片T(给定的子图像),另外需要一个待检测的图像S(源图像)。
工作方法:在待检测图像上,从左至右,从上到下计算模板图像与重叠子图像的匹配程度,匹配程度越大,两者相同的可能性越大。
OpenCV通过函数 matchTemplate 实现了模板匹配算法. 可用的方法有6个:
- 平方差匹配 method=CV_TM_SQDIFF
这类方法利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大.
- 标准平方差匹配 method=CV_TM_SQDIFF_NORMED
- 相关匹配 method=CV_TM_CCORR
这类方法采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果.
- 标准相关匹配 method=CV_TM_CCORR_NORMED
- 相关匹配 method=CV_TM_CCOEFF
这类方法将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列).
在这里
- 标准相关匹配 method=CV_TM_CCOEFF_NORMED
通常,随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价). 最好的办法是对所有这些设置多做一些测试实验,以便为自己的应用选择同时兼顾速度和精度的最佳方案.
import cv2 as cv
import numpy as np
def template_demo():
tpl = cv.imread("opencv_sources/template.png")
target = cv.imread("opencv_sources/test.jpg")
cv.imshow("template",tpl)
cv.imshow("test",target)
methods =[cv.TM_SQDIFF_NORMED,cv.TM_CCORR_NORMED,cv.TM_CCOEFF_NORMED]
th,tw = tpl.shape[:2] # mg.shape[:2] 取彩色图片的长、宽,如果mg.shape[:3] 取取彩色图片的长、宽、通道
for md in methods:
print(md)
result = cv.matchTemplate(target,tpl,md)
# 在result里寻找最小值最大值及其位置
min_val,max_val,min_loc,max_loc = cv.minMaxLoc(result) # result里放的公式计算出来的值,每个像素点对应一个值
if md == cv.TM_SQDIFF_NORMED:
tl = min_loc # toplight是左上角那个点
else:
tl =max_loc
br = (tl[0]+tw,tl[1]+th) # tl[0]表示x轴tl[1]表示y轴
cv.rectangle(target,tl,br,(0,0,255),2)
cv.imshow("match--"+np.str(md),target)
print("=====Hello Python=====")
template_demo()
cv.waitKey(0)
cv.destroyAllWindows()
运行结果: