2019-04-10 OpenCV学习

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个:

  1. 平方差匹配 method=CV_TM_SQDIFF

这类方法利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大.

  1. 标准平方差匹配 method=CV_TM_SQDIFF_NORMED
  1. 相关匹配 method=CV_TM_CCORR

这类方法采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果.

  1. 标准相关匹配 method=CV_TM_CCORR_NORMED
  1. 相关匹配 method=CV_TM_CCOEFF

这类方法将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列).

在这里

  1. 标准相关匹配 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()

运行结果:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,132评论 6 523
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,457评论 3 404
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,411评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,147评论 1 301
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,145评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,611评论 1 315
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,962评论 3 429
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,948评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,479评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,514评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,640评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,228评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,973评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,402评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,551评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,210评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,714评论 2 366

推荐阅读更多精彩内容