《学习OpenCV》第7章 直方图与匹配
- 格式:pptx
- 大小:2.59 MB
- 文档页数:69


4.OpenCV-Python——模版匹配、直⽅图⼀、模版匹配1、模版匹配 模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地⽅)的差别程度,这个差别程度的计算⽅法在opencv⾥有6种,然后将每次计算的结果放⼊⼀个矩阵⾥,作为结果输出。
假如原图形是AxB⼤⼩,⽽模板是axb⼤⼩,则输出结果的矩阵是(A-a+1)x(B-b+1)。
TM_SQDIFF:计算平⽅不同,计算出来的值越⼩,越相关TM_CCORR:计算相关性,计算出来的值越⼤,越相关TM_CCOEFF:计算相关系数,计算出来的值越⼤,越相关TM_SQDIFF_NORMED:计算归⼀化平⽅不同,计算出来的值越接近0,越相关TM_CCORR_NORMED:计算归⼀化相关性,计算出来的值越接近1,越相关TM_CCOEFF_NORMED:计算归⼀化相关系数,计算出来的值越接近1,越相关1# *******************模版匹配**********************开始2import cv23import numpy as np4import matplotlib.pyplot as plt56# 模板匹配7 img = cv2.imread('lena.jpg', 0)8 template = cv2.imread('face.jpg', 0)910 h, w = template.shape[:2]1112 methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',13'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']1415# 匹配⽅法16 res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)17print(res.shape)18# 匹配结果返回19 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)20print(min_val,max_val,min_loc,max_loc)2122# 6种不同⽅法⽐较23for meth in methods:24 img2 = img.copy()2526# 匹配⽅法的真值27 method = eval(meth)28print (method)29 res = cv2.matchTemplate(img, template, method)30 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)3132# 如果是平⽅差匹配TM_SQDIFF或归⼀化平⽅差匹配TM_SQDIFF_NORMED,取最⼩值33if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:34 top_left = min_loc35else:36 top_left = max_loc37 bottom_right = (top_left[0] + w, top_left[1] + h)3839# 画矩形40 cv2.rectangle(img2, top_left, bottom_right, 255, 2)4142 plt.subplot(121), plt.imshow(res, cmap='gray')43 plt.xticks([]), plt.yticks([]) # 隐藏坐标轴44 plt.subplot(122), plt.imshow(img2, cmap='gray')45 plt.xticks([]), plt.yticks([])46 plt.suptitle(meth)47 plt.show()48# *******************模版匹配**********************结束六种⽅法的匹配结果:2、多个匹配1# *******************膜版匹配-多个匹配**********************开始2import cv23import numpy as np4import matplotlib.pyplot as plt56 img_rgb = cv2.imread('mario.jpg')7 img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)8 template = cv2.imread('mario_coin.jpg', 0)9 h, w = template.shape[:2]1011 res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)12 threshold = 0.813# 取匹配程度⼤于%80的坐标14 loc = np.where(res >= threshold)15for pt in zip(*loc[::-1]): # *号表⽰可选参数16 bottom_right = (pt[0] + w, pt[1] + h)17 cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)1819 cv2.imshow('img_rgb', img_rgb)20 cv2.waitKey(0)21# *******************膜版匹配-多个匹配**********************结束⼆、直⽅图cv2.calcHist(images,channels,mask,histSize,ranges)images: 原图像图像格式为 uint8 或 float32。
图像处理技术中的直方图匹配方法介绍直方图匹配是图像处理技术中常用的一种方法,它可以用来改变图像的亮度分布,使之符合特定的标准。
本文将介绍直方图匹配的原理、方法和应用。
直方图是图像中各灰度级的统计信息,它可以反映图像的亮度分布。
直方图匹配的目标是通过对比两个图像的直方图,调整一个图像的像素值,使其直方图与另一个图像的直方图相匹配。
直方图匹配的原理是将原始图像的亮度分布映射到目标图像的亮度分布上。
具体过程包括以下步骤:计算原始图像和目标图像的直方图。
直方图可以通过统计每个灰度级的像素个数计算得出。
将原始图像的直方图进行归一化处理,以使得图像的亮度范围保持一致。
计算原始图像和目标图像的累积直方图。
累积直方图反映了每个灰度级及其前面所有灰度级的像素个数累加值。
接着,根据原始图像和目标图像的累积直方图,计算像素值映射表。
该映射表可以通过将原始图像上的每个灰度级映射到目标图像上对应的灰度级来实现直方图匹配。
使用像素值映射表将原始图像的像素值映射到目标图像上,完成直方图匹配。
在图像处理中,直方图匹配有多种应用。
其中一个主要应用是图像增强。
通过将一幅图像的直方图匹配到另一幅具有良好亮度分布的图像上,可以增强原始图像的对比度和细节,改善图像的视觉效果。
直方图匹配也可以用于图像配准。
在医学影像、遥感影像等领域,图像配准是一个重要的任务。
通过直方图匹配,可以使两幅图像在亮度上具有一致性,从而提高图像配准的准确性。
直方图匹配还可以用于图像分类和目标检测。
通过将图像的直方图与训练样本的直方图进行匹配,可以实现图像的自动分类和目标的自动检测。
需要注意的是,直方图匹配虽然可以改善图像的亮度分布,但也可能导致图像的颜色失真。
因此,在应用直方图匹配时需要谨慎,根据具体情况进行权衡和调整。
总结来说,直方图匹配是图像处理中常用的方法,可以通过调整图像的亮度分布实现图像增强、图像配准、图像分类和目标检测。
在实际应用中,需要充分考虑图像的特点和需求,谨慎选择合适的参数和方法,以达到最佳效果。
opencv中的直方图与匹配灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其横坐标是灰度级,纵坐标是该灰度出现的频率(像素的个数)。
在opencv中可以通过cvCreateHist()来生成直方图CvHistogram* cvCreateHist(int dims,int* sizes,int type,float** ranges=NULL,int uniform=1)dims//直方图包含的维数sizes//数组的长度等于dims,数组中每个整数表示分配给对应维数的的bin的个数type//表示存储类型,CV_HIST_ARRAy表示用密集多维矩阵结构存储直方图,CV_HIST_SPARSE表示数据已稀疏矩阵方式存储ranges=NULL,//浮点数对的构成的数组,每个浮点数对表示对应维数的bin的区间的上下界uniform=1//非0表示均匀直方图,为NULL表示未知,即在后面可以设置。
CvHistogram* cvCreateHist(使用cvCalcHist()函数来计算直方图void cvCalcHist(IplImage** image,CvHistogram* hist,int accmulate=0,const CvArr* mask=NULL)image //是一个指向数组的IplImage*类型的指针,着允许利用多个图像通道hist //要计算的直方图accmulate //非0时,表示直方图hist在读入图像之前没有被清零mask //如果为非NULL,则只有与mask非零元素对应的像素点会被包含在计算直方图中。
1.单通道图像的直方图#include "stdafx.h"#include <highgui.h>#include <math.h>#include <cv.h>int main(){IplImage* sourceImage=0;//以单通道读入图像if(!(sourceImage=cvLoadImage("YAYA.jpg",0))) return -1;int hdims=51; //分配给对应维数的bin的个数float rangesArray[]={0,255};float* ranges[]={rangesArray};float maxValue;CvHistogram* histogram=0;histogram=cvCreateHist(1,&hdims,CV_HIST_ARR AY,ranges,1);IplImage* histImage; //用来显示直方图histImage=cvCreateImage(cvGetSize(sourceImage),8, 3);cvZero(histImage);//计算直方图cvCalcHist(&sourceImage,histogram,0,0);//获取最大值cvGetMinMaxHistValue(histogram,0,&maxValue,0 ,0);cvConvertScale(histogram->bins,histogram->bins, maxValue?255./maxValue:0,0);float binsWidth;binsWidth=histImage->width/hdims;CvScalar color=CV_RGB(255,255,255);for(int i=0;i<hdims;i++){doublevalue=(cvGetReal1D(histogram->bins,i)*histImage-> height/255);cvRectangle(histImage,cvPoint(i*binsWidth,histImage->height),cvPoint((i+1)*binsWidth,(int)(histImage->hei ght-value)),color,1,8,0);}//显示cvNamedWindow("sourceImage",0);cvNamedWindow("histImage",0);cvShowImage("sourceImage",sourceImage);cvShowImage("histImage",histImage);//释放资源cvDestroyAllWindows();cvReleaseImage(&sourceImage);cvReleaseImage(&histImage);cvReleaseHist(&histogram);cvWaitKey(-1);return 0;}运行结果:多通道图像的直方图因为ccCalHist()只接受单通道图像,所以在调用cvCalcHist()之前,首先用cvSplit()将多通道图像分解为单通道图像。
详解pythonOpenCV学习笔记之直⽅图均衡化本⽂介绍了python OpenCV学习笔记之直⽅图均衡化,分享给⼤家,具体如下:考虑⼀个图像,其像素值仅限制在特定的值范围内。
例如,更明亮的图像将使所有像素都限制在⾼值中。
但是⼀个好的图像会有来⾃图像的所有区域的像素。
所以你需要把这个直⽅图拉伸到两端(如下图所给出的),这就是直⽅图均衡的作⽤(⽤简单的话说)。
这通常会改善图像的对⽐度。
建议阅读关于直⽅图均衡的wikipedia页⾯,了解更多有关它的详细信息。
它给出了⼀个很好的解释,给出了⼀些例⼦,这样你就能在读完之后理解所有的东西。
同样,我们将看到它的Numpy实现。
之后,我们将看到OpenCV函数。
import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('wiki.jpg', 0)hist, bins = np.histogram(img.flatten(), 256, [0,256])cdf = hist.cumsum()cdf_normalized = cdf*float(hist.max())/cdf.max()plt.plot(cdf_normalized, color = 'b')plt.hist(img.flatten(),256,[0,256], color = 'r')plt.xlim([0,256])plt.legend(('cdf','histogram'), loc = 'upper left')plt.show()你可以看到,直⽅图位于更亮的区域。
我们需要完整的频谱。
为此,我们需要⼀个转换函数,它将更亮区域的输⼊像素映射到全区域的输出像素。
这就是直⽅图均衡所做的。