低秩稀疏矩阵分解+导向滤波消除显示屏照片摩尔纹

《醉花阴》

锦瑟年华谁与度 莫问情归处 只影向斜阳 剑吼西风 欲把春留驻

天涯芳草无归路 回首花无数 解语自销魂 弱袂萦春 尘缘不相误

工作需求,使用低秩稀疏矩阵分解和导向滤波用于消除显示屏照片的摩尔纹,介绍一下使用的算法和代码实现。

低秩矩阵分解代码放在GitHub上,路径如下:

GitHub - tklk610/Demoire-With-Low-Rank-Matrix-Factorization

目录:

  • 摩尔纹及算法流程;
  • 基于增广拉格朗日算子的低秩稀疏矩阵分解模型及代码实现
  • 导向滤波算法及代码实现;

摩尔纹及算法流程

整体算法流程参考了天津大学的一篇硕士毕业论文《基于图像分解的纹理图像摩尔纹消除方法》,本文针对使用数码相机拍摄显示屏图像时照片上产生的摩尔纹,关于摩尔纹本文不做详细介绍,摩尔纹源于法文 Moiré一词,泛指两个频率相近的等幅正弦波叠加而产生的干涉条纹。 摩尔纹可看作是一种混叠干扰噪声,摩尔纹的结构和分布与场景信息、数码相机采样频率和插值算法密切相关,不同场景情况下摩尔纹形状不同,没有明显的分布规律。

摩尔纹如下图所示:

本文使用的算法流程为应用基于增广拉格朗日算子的低秩稀疏矩阵分解模型实现绿色通道图像中纹理层与摩尔纹层的分离,以绿色通道的纹理层图像为参考应用导向滤波模型实现红、蓝通道图像的纹理层恢复,得到最终消除摩尔纹的图像。

算法流程如下图:

基于增广拉格朗日算子的低秩稀疏矩阵分解模型及代码实现

有点类似主成分分析或是SVD,详细介绍可参考如下链接:

https://www.cnblogs.com/louisanu/p/12162008.html

纹理图像中摩尔纹现象是由数码相机场景采集过程中欠采样导致,纹理高频信息在采样频率下混叠到低频成分即对应空间域可见的摩尔纹结构。结合人眼对高频色彩信息的不敏感特性,本文将纹理图像中的摩尔纹干扰简化为加性干扰模型,即摩尔纹干扰降质纹理图像可分解为纹理图像成分和摩尔纹成分,通过设计合理的非相关特征分别约束纹理图像成分和摩尔纹成分,从而实现两者的有效分离。

实现代码如下:

% low rank image completion by SVT algorithm
clear
clc

src_path = fullfile('D:\工作\程序\low rank recovery code\test');
tar_path = fullfile('D:\工作\程序\low rank recovery code\result');

filelist=dir(fullfile(src_path, '*.bmp'));

for n =1:length(filelist)
    A = imread(fullfile(src_path, filelist(n).name));
    
    WW = double(A) ;
    a1 = double(A(:,:,1)) ;
    a2 = double(A(:,:,2)) ;
    a3 = double(A(:,:,3)) ;
    
    [M,N] = size(a1);
    
    X = zeros(M,N,3);
    % sampling
    pos = sort(randperm(M*N,M*N*0.5))' ;
    
    for jj = 1:3
        P = zeros(M*N,1) ;
        MM = reshape(double(WW(:,:,jj)),M*N,1) ;
        P(pos) = MM(pos) ;
        index1 = find(P) ;
        P(index1) = 1 ;
        %     P(index1) = rand(size(index1,1),1) ;
        P = reshape(P,M,N) ;
        T = 40000 ;
        delta_t = 1 ;
        
%         [X(:,:,jj), iterations] = SVT(WW(:,:,jj), P, T, delta_t) ;
        
        if jj ==2
            [X(:,:,jj), iterations] = SVT(WW(:,:,jj), P, T, delta_t) ;
        else
            X(:,:,jj) = WW(:,:,jj) ;
        end
        %     [ X(:,:,jj)] = pcp_ad(WW(:,:,jj)) ;
    end
    
    DD  = P.*WW(:,:,1) ;
    DD1 = P.*WW(:,:,2) ;
    DD2 = P.*WW(:,:,3) ;
    
    ff(:,:,1) = DD;
    ff(:,:,2) = DD1;
    ff(:,:,3) = DD2;
    
    figure(1)
    subplot(1,3,1)
    imshow(A)
    title('原图')
    
    subplot(1,3,2)
    imshow(uint8(ff))
    title('采样后的图')
    
    subplot(1,3,3)
    imshow(uint8(X))
    title('恢复的图')
    
    imwrite(uint8(X), fullfile(tar_path, filelist(n).name))
    
    
end

基于增广拉格朗日算子的低秩稀疏矩阵分解模型可以对一些有噪声干扰的图像进行去噪处理,一般是对三通道图像都进行处理,效果图如下:

本文对数码相机拍摄的显示屏图像应用基于增广拉格朗日算子的低秩稀疏矩阵分解模型时只对绿色通道进行处理,不处理红蓝通道图像。

绿色通道信息的采样率为 50%,红蓝两色通道的采样率为 25%。红、蓝色通道图像摩尔纹干扰更加严重,该模型得到的纹理层图像质量不如绿色通道,且低秩稀疏矩阵分解模型的求解过程需要多次迭代才能达到收敛,算法复杂度较高。另外,考虑到彩色图像三通道图像间结构信息的相似性,本文以导向滤波模型替代低秩稀疏矩阵分解模型对红、蓝通道图像进行处理。

导向滤波算法及代码实现

何凯明的一大力作,导向滤波算法是一种基于线性模型的边缘保留滤波器,滤波输出是参考图像的局部线性变换。一方面,导向滤波器具有类似双边滤波器的良好的边缘保留平滑特性,但不会出现逆梯度效应;另一方面,导向滤波器的作用不止可以平滑图像,借助参考图像,该方法还可以获得比输入图像结构信息更丰富的滤波输出。不仅如此,导向滤波算法的时间复杂度与输入图像的像素数成正比,与图像维度、滤波核尺寸以及信号强度无关。因此,借助导向滤波算法,当恢复得到绿色通道的纹理层图像,可以高效地获得红、蓝色通道对应的纹理层图像。

关于导向滤波可以参考:

 https://zhuanlan.zhihu.com/p/161666126

算法示意图如下:

实现代码如下:

def guideFilter(src_path, tar_path, winSize, eps) :

    for file in os.listdir(src_path):
        file_path = os.path.join(src_path, file)

        if os.path.isdir(file_path):
            guideFilter(file_path, tar_path, winSize, eps)
        else :
            image = cv2.imread(file_path)

            new_image = p.zeros(image.shape, dtype = "uint8")

            I = image / 255.0  # 将图像归一化,导向图

            for i in range(3) :
                p = image[:, :, i]

                mean_I = cv2.blur(I, winSize)      # I的均值平滑
                mean_p = cv2.blur(p, winSize)      # p的均值平滑

                mean_II = cv2.blur(I * I, winSize)  # I*I的均值平滑
                mean_Ip = cv2.blur(I * p, winSize)  # I*p的均值平滑

                var_I  = mean_II - mean_I * mean_I  # 方差
                cov_Ip = mean_Ip - mean_I * mean_p  # 协方差

                a = cov_Ip / (var_I + eps)         # 相关因子a
                b = mean_p - a * mean_I            # 相关因子b

                mean_a = cv2.blur(a, winSize)      # 对a进行均值平滑
                mean_b = cv2.blur(b, winSize)      # 对b进行均值平滑

                q = mean_a * I + mean_b

                # 保存导向滤波结果
                guideFilter_img = q * 255
                guideFilter_img[guideFilter_img > 255] = 255
                guideFilter_img = np.round(guideFilter_img)
                guideFilter_img = guideFilter_img.astype(np.uint8)

                print("img channel is {}".format(guideFilter_img.shape))

                new_image[:, :, i] = guideFilter_img

            print("img channel is {}".format(new_image.shape))

            new_name = os.path.join(tar_path, file)

            cv2.imwrite(new_name, new_image)

由于是公司项目,测试结果图就不放了。

最近《元龙》第二季,第一季还是不错的,所以第二季也比较期待,虽然画质制作不错,可惜剧情改得过分了,《元龙》的特色就是类似鲁路修那种天才级别的开无双,外加杀伐果断。动画里的王胜性格和做事方式差太多了,强力推荐原作小说,那叫一个爽。

另外,《元龙》作者另一部小说《神工》,完美继承《元龙》小说精髓,剧情紧凑,主角能力一骑绝尘,性格不怂不软不娘,杀伐果断,情感戏不拖沓,该上就上。推一百波,连看了几个通宵了,爽死了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千穹凌帝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值