如何在Emgucv C#上实现锐化蒙版

时间:2019-08-05 15:35:25

标签: c# opencv emgucv

我正在尝试使用c#在emgucv上实现不清晰的遮罩方法。

我现在拥有的python代码是(ref):

def unsharp_mask(image, kernel_size=(5, 5), sigma=1.0, amount=1.0, threshold=0):
    """Return a sharpened version of the image, using an unsharp mask."""
    # For details on unsharp masking, see:
    # https://en.wikipedia.org/wiki/Unsharp_masking
    # https://homepages.inf.ed.ac.uk/rbf/HIPR2/unsharp.htm
    blurred = cv.GaussianBlur(image, kernel_size, sigma)
    sharpened = float(amount + 1) * image - float(amount) * blurred
    sharpened = np.maximum(sharpened, np.zeros(sharpened.shape))
    sharpened = np.minimum(sharpened, 255 * np.ones(sharpened.shape))
    sharpened = sharpened.round().astype(np.uint8)
    if threshold > 0:
        low_contrast_mask = np.absolute(image - blurred) < threshold
        np.copyto(sharpened, image, where=low_contrast_mask)
    return sharpened

我现在拥有的C#代码无法完成上述代码的工作。有谁知道如何使用c#实现emgu cv?

public static void GetMat(Image<Gray, byte> srcimg, Image<Gray, byte> imgBlurred, ref Mat dst, int nAmount = 200)
{
    float amount = nAmount / 100f;
    using (Image<Gray, byte> dst_temp = new Image<Gray, byte>(srcimg.Width, srcimg.Height))
    {
        for (int v = 0; v < srcimg.Height; v++)
        {
            for (int u = 0; u < srcimg.Width; u++)
            {
                byte a = srcimg.Data[v, u, 0]; //Get Pixel Color | fast way
                byte b = imgBlurred.Data[v, u, 0];
                int c = (int)(a * (1 + amount) - (amount * b));
                if (c < 0) c = 0;
                if (c > 255) c = 255;
                dst_temp.Data[v, u, 0] = (byte)c;
            }
        }
        dst = dst_temp.Mat.Clone();
    }
}

public static void getSharpenImage(Mat src, ref Mat dst, int nAmount = 200, double sigma = 3, int threshold = 0)
{
    float amount = nAmount / 100.0F;
    using (Mat imgBlurred = new Mat())
    {
        CvInvoke.GaussianBlur(src, imgBlurred, new System.Drawing.Size(0, 0), sigma, sigma);
        using (Mat mask_temp = new Mat())
        {
            CvInvoke.AbsDiff(src, imgBlurred, mask_temp);
            using (Mat lowcontrastmask = new Mat())
            {
                CvInvoke.Threshold(mask_temp, lowcontrastmask, threshold, 255, ThresholdType.BinaryInv);
                GetMat(src.ToImage<Gray, byte>(), imgBlurred.ToImage<Gray, byte>(), ref dst);
                src.CopyTo(dst, lowcontrastmask);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

https://www.idtools.com.au/unsharp-masking-python-opencv/有一个python解决方案。

以下在C#中有效:

Mat blurredImage = new Mat();
Mat lapImage = new Mat();
CvInvoke.MedianBlur(grayImage, blurredImage, 1);
CvInvoke.Laplacian(blurredImage, lapImage, blurredImage.Depth);
blurredImage -= (0.9*lapImage);