与OpenCV中的色彩噪声进行图像比较?

时间:2013-10-09 12:00:25

标签: python image opencv compare

我有一个代码:

def compare_frames(frame1, frame2): 
    # cropping ranges of two images
    frame1, frame2 = similize(frame1, frame2)

    sc = 0
    h = numpy.zeros((300,256,3))
    frame1= cv2.cvtColor(frame1,cv2.COLOR_BGR2HSV)
    frame2= cv2.cvtColor(frame2,cv2.COLOR_BGR2HSV)
    bins = numpy.arange(256).reshape(256,1)
    color = [ (255,0,0),(0,255,0),(0,0,255) ]

    for ch, col in enumerate(color):
       hist_item1 = cv2.calcHist([frame1],[ch],None,[256],[0,255])
       hist_item2 = cv2.calcHist([frame2],[ch],None,[256],[0,255])
       cv2.normalize(hist_item1,hist_item1,0,255,cv2.NORM_MINMAX)
       cv2.normalize(hist_item2,hist_item2,0,255,cv2.NORM_MINMAX)
       sc = sc + (cv2.compareHist(hist_item1, hist_item2, cv2.cv.CV_COMP_CORREL)/len(color))
    return sc

它可以工作,但如果图像有色噪声(更暗/淡色),它就不起作用,并且相似等于0.5。 (需要0.8)

image1

image2

图像2比图像1更暗。

你能否建议我快速比较algorythm忽略光线,模糊,图像上的噪音或修改它?

注意:

我也有模板匹配algorythm:

但它的工作速度比我需要的慢,尽管相似度为0.95。

def match_frames(frame1, frame2):
    # cropping ranges of two images
    frame1, frame2 = similize(frame1, frame2)

    result = cv2.matchTemplate(frame1,frame2,cv2.TM_CCOEFF_NORMED)
    return numpy.amax(result)

由于

2 个答案:

答案 0 :(得分:1)

您的问题是计算机视觉和图像处理中的经典问题之一。许多博士论文已经在会议和期刊上撰写并发表了大量论文。

简而言之,直接像素比较在这种情况下不起作用。需要某种转换来带您到不同的功能空间。根据您的要求,您可以做一些简单或复杂的事情。你可以计算边或角。已经提到的一个建议是FAST角点检测。这将是一个很好的选择,就像SIFT等...你可以使用许多其他的,但它将取决于两个图像可以变化多少以及以何种方式。

例如,如果只有全局颜色变化,色调等,那么方法将不同于图像可以旋转或物体位置大小变化(即相机变焦)。

严格来说,对于这种情况,你提到的功能,如FAST,SIFT,甚至边缘都可以很好地工作。查看http://en.wikipedia.org/wiki/Feature_detection_%28computer_vision%29了解详情

答案 1 :(得分:0)

图像补丁描述符(SIFT,SURF ...)通常是单色的并且期望黑白图像。因此,对于任何方法(点匹配,帧匹配......),我建议您首先将颜色空间更改为Lab或YUV,然后在亮度平面上工作。

FAST是一种(快速)角点检测算法。角落显然对噪声和对比度不敏感,但可能受模糊影响(例如,位置不好,角落响应不好)。然而,FAST不包括描述符部分,因此您的匹配应该依赖于几何接近度。如果您需要描述符部分,那么您需要切换到许多其他关键点描述符之一(SIFT,SURF,FAST + BRIEF / BRISK / ORB / FREAK ......)。