對圖像進行SVD和PCA降維,可用於壓縮或者圖像數據增強(python版)


不懂原理的同學請參考:

https://blog.csdn.net/qq_43337858/article/details/102738352?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-6.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-6.control

def svd(img, topk_percent=0.7):
    """
    使用svd對圖片降維,可作為一種數據增強手段
    每列作為一個向量,先構建方陣,再求特征值 特征向量,取前N個主成分,再重構圖像
    :param img: 輸入圖像
    :param topk_percent: 圖像恢復率,
    :return: img after svd
    """
    img_src = img[...]
    if len(img.shape) == 3:
        img_src = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)

    h, w = img_src.shape
    data = np.asarray(img_src, np.double)
    # 以下兩種方式都可以
    # method 1
    U, s, V = np.linalg.svd(data)
    K = round(len(s) * topk_percent)
    S = np.diag(s)
    major_data = np.dot(U[:, :K], np.dot(S[:K, :K], V[:K, :]))
    # # method 2
    # feat_values, feat_vectors = np.linalg.eig(np.dot(data.T, data))
    # feat_index = np.argsort(np.sqrt(feat_values), axis=0)[::-1]
    # S = np.diag(feat_values)
    # V = feat_vectors[:, feat_index]
    # S_inv = np.asmatrix(S).I
    # V_inv = np.asmatrix(V).I
    # U = np.dot(np.dot(data, V), S_inv)
    # K = round(S.shape[0] * topk_percent)
    # major_data = np.dot(np.dot(U[:, :K], S[:K, :K]), V_inv[:K, :])

    rebuild_img = np.asarray(major_data, np.uint8)

    cv2.imshow('1', rebuild_img)
    cv2.waitKey(0)
    return rebuild_img


def pca(img, topk_percent=0.7):
    """
    使用pca對圖片降維,可作為一種數據增強手段
    每列作為一個向量,先0均值化,再求協方差矩陣的特征值和特征向量,取前N個主成分,再重構圖像
    :param img: 輸入圖像
    :param topk_percent: 圖像恢復率,
    :return: img after pca
    """
    img_src = img[...]
    if len(img.shape) == 3:
        img_src = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)

    print(img_src.shape)
    h, w = img_src.shape
    data = np.asarray(img_src, np.double)
    # 計算每列的mean
    _mean = np.mean(data, axis=0)
    data -= _mean
    # 以 列為變量計算方式,計算協方差矩陣
    data_cov = np.cov(data, rowvar=False)
    feat_values, feat_vectors = np.linalg.eig(data_cov)
    feat_index = np.argsort(np.sqrt(feat_values), axis=0)[::-1]
    V = feat_vectors[:, feat_index]
    K = round(len(feat_values) * topk_percent)# 重建圖像
    major_data = np.dot(np.dot(data, V[:, :K]), V[:, :K].T) + _mean
    rebuild_img = np.asarray(major_data, np.uint8)

    cv2.imshow('1', rebuild_img)
    cv2.waitKey(0)
    return rebuild_img

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM