[opencv] 对图片清晰度特征的计算

看了这个专栏https://zhuanlan.zhihu.com/p/97024018,写的不错,但里边实现的都是用for循环写的,性能一般,现在用矩阵计算的形式优化了几个,性能有了些提升,记录一下。

需要注意的是,为了计算方便,我这里改成从右上减左下得到灰度差的方式,原文中用的左上-右下,需要的可以改一改。

def entropy(arr):
    """
    计算图片的熵,输入为图片灰度矩阵
    """
    count = np.shape(arr)[0]*np.shape(arr)[1]
    p = np.bincount(np.array(arr).flatten())
    x = p*np.log(p/count)/count
    return -np.nansum(p*np.log(p/count)/count)

def SMD2(arr):
    """
    计算图片的灰度方差乘积(SMD)改进版
    """
    move_right = np.roll(arr,1)
    move_down = np.roll(arr,1,axis=0)
    sub_right = arr - move_right
    sub_down = arr - move_down
    final_mat = sub_right[1:,1:]*sub_down[1:,1:] # 对应位置相乘
    return np.sum(np.absolute(final_mat)) # 各个位置的值相加,取绝对值

def energy_new(arr):
    """
    能量梯度函数
    """
    move_right = np.roll(arr,1)
    move_down = np.roll(arr,1,axis=0)
    sub_right = (arr - move_right)[1:,1:]
    sub_down = (arr - move_down)[1:,1:]
    final_mat = sub_right*sub_right+sub_down*sub_down # 灰度差先平方,在把各个方向上的差相加
    return np.sum(final_mat) # 各个位置的值相加,取绝对值

你可能感兴趣的:(机器学习,opencv,计算机视觉,python)