2013-10-09 39 views
-1

我有一个代码:与OpenCV中的色彩噪声的图像比较?

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.

你建议我FAST比较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) 

感谢

回答

0

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

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

+0

任何示例或链接? – xercool

1

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

简而言之,直接像素比较在这种情况下不起作用。需要某种变换将您带到不同的特征空间。根据您的要求,您可以做简单或复杂的事情。你可以计算边或角。已经提到的一个建议是FAST角点检测。这将是一个不错的选择,就像SIFT等一样......还有很多其他的你可以使用,但这取决于两幅图像可以变化多少以及以何种方式。例如,如果只有全局颜色变化,色调等,则该方法将不同于如果图像可以被旋转或者物体位置的大小改变(即,相机缩放),则该方法会不同。

严格来说,对于您提到的功能如FAST,SIFT,甚至边缘都可以很好地工作。请查询http://en.wikipedia.org/wiki/Feature_detection_%28computer_vision%29以获取更多信息