视频抖动的检测(1)python版本

之前看过别人的代码,觉得效果不错,但是原作者不可能给出源码,所以我想倾力复制一个出来。
第一步,制造灰度图,灰度图只有一个通道,在这里我们用opencv的函数可以轻易做到。

imgpath="Pictures/1.jpg"
img=cv2.imread(imgpath)
img0=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow("image",img)
cv2.imshow("image2",img0)
cv2.waitKey(0)

接下来就是要从这张灰度图上获取灰度值
顺便说一句,灰度图的获取也是有技巧的,这个函数我也没弄明白它是什么办法获取的灰度图,根据不同的应用条件,灰度图应当有不同的生成方式,在这里,先不深究。

获取行灰度向量和列灰度向量

def calculate(img,flag):
    height=img.shape[0]  #图片的高 也就是行数 
    width=img.shape[1]   #图片的宽 也就是列数
    print(height,width)
    if flag==0:     #行向量投
        G=np.zeros(height)
        MeanR=0
        Rpro=np.zeros(height)        
        for i in range(height):  
             for j in range(width):
                 G[i]=G[i]+img[i,j]
        for i in range(height):
             MeanR=MeanR+G[i]  
        MeanR=MeanR/height

        for i in range(height):
             Rpro[i]=G[i]-MeanR
        return Rpro
    else:    #列向量投影
        
        G=np.zeros(width)        
        MeanC=0
        Cpro=np.zeros(width)
        for i in range(width):
            for j in range(height):
                G[i]=G[i]+img[j,i]
        for i in range(width):
            MeanC=MeanC+G[i]
   
        MeanC=MeanC/width
        for i in range(width): 
            Cpro[width]=G[i]-MeanC
        return Cpro

再利用行灰度投影和列灰度投影来计算移动的距离,道理很简单,找到两张图中灰度最接近的一列或者是一行,求得它们彼此之间相差的像素距离

def zhenCompare(Col,Col0,img,flag):
   
    height=img.shape[0]
    width=img.shape[1]
    
    R=np.zeros(height)
    C=np.zeros(width)
    m1=np.zeros(height)
    mm=np.zeros(height)
    if flag ==0:
    # 行灰度投影处理
        for i in range(height):
            for j in range(height):
                R[j]=(Col[i]-Col0[j])*(Col[i]-Col0[j])
            mm=min(R) 
            #print(mm)
            for j in range(height):#从后向前遍历,求得的结果是最长的移动位置
                if R[j]==mm:
                    m1[i]=mm  #求得了最相似的一行但是移动最长的位置
        mmm=min(m1) # 从最长的移动距离里面找到最短的位置
        return mmm
 #列灰度投影
    else :
        for i in range(width):
            for j in range(width):
                R[j]=(Col[i]-Col0[j])*(Col[i]-Col0[j])
            mm=min(R[j])
            for j in range(height): #从后向前遍历
                if R[j]==mm:
                    m1[i]=mm  #求得了最相似的一行但是移动最长的位置 
        mmm=min(m1) # 从最长的移动距离里面找到最短的位置
        return mmm*1000
 

这样子就是最简单的利用灰度投影求移动距离,实用性不大,大家可以在这个基础上继续升级。

你可能感兴趣的:(随笔流水账,opencv,视频抖动检测)