0

NPP を使用して「アンシャープ マスク」を作成しようとしましたが、画像がシャープにならず、一部の領域が少し明るくなりました。このコードの何が問題なのか分かりますか?

    npp::loadImage("Lena.pgm", hostSrc);

    // put two copies of the image in GPU memory
    // one we'll turn into the unsharp mask                                                                                                                      
    npp::ImageNPP_8u_C1 deviceSrc(hostSrc);
    npp::ImageNPP_8u_C1 deviceUnsharpMask(hostSrc);

    // 5x5 box for mask 
    NppiSize maskSize = {5, 5};

    // create ROI based on image size and mask size                                                                                              
    NppiSize maskedROI = {deviceSrc.width() - maskSize.width + 1,
                          deviceSrc.height() - maskSize.height + 1};

    // allocate device blurred image                                                                                              
    npp::ImageNPP_8u_C1 deviceBlurred(maskedROI.width, maskedROI.height);

    NppiPoint anchor = {0, 0};

    // run box filter                                                                                                                                     
    nppiFilterBox_8u_C1R(deviceSrc.data(), deviceSrc.pitch(),
                         deviceBlurred.data(), deviceBlurred.pitch(),
                         maskedROI, maskSize, anchor);

    // subtract the masked image from the scratch image                                                                                                   
    eStatusNPP = nppiSub_8u_C1IRSfs(deviceBlurred.data(), deviceBlurred.pitch(),
                                    deviceUnsharpMask.data(), deviceUnsharpMask.pitch(),
                                    maskedROI, 1);


    // now add the mask to the src image                                                                                                                  
    eStatusNPP = nppiAdd_8u_C1IRSfs(deviceUnsharpMask.data(), deviceUnsharpMask.pitch(),
                                    deviceSrc.data(), deviceSrc.pitch(),
                                    maskedROI, 0);

    // then copy back to host and save to file
4

1 に答える 1

-1

アンシャープ マスクは次のように機能します。

  1. 元の画像をぼかす - これを BI と呼びましょう。
  2. 元の画像 (詳細) からぼやけた画像を差し引く - DI = OI - BI.
  3. 詳細を増幅し、元の画像に追加します - USMI = OI + alpha * DI.

それがあなたがしていることだと確信していますか?

参照 MATLAB コードは次のとおりです。

function [ mUsmImage ] = Usm( mInputImage, usmAmount, usmRadius )

gaussianKernelRadius = ceil(6 * usmRadius);

mGaussianKernel = exp(-([-gaussianKernelRadius:gaussianKernelRadius] .^ 2) / (2 * usmRadius * usmRadius));

mGaussianKernel = mGaussianKernel.' * mGaussianKernel;
mGaussianKernel = mGaussianKernel / sum(mGaussianKernel(:));

mBlurredLayer = imfilter(mInputImage, mGaussianKernel, 'replicate');

mUsmImage = mInputImage + (usmAmount * (mInputImage - mBlurredLayer ));

end

コードはグレースケール画像で機能します。RGBに簡単に採用できます。

楽しみ。

于 2014-06-02T21:18:47.413 に答える