Sobel filter kernel of large size

后端 未结 9 789
渐次进展
渐次进展 2020-12-02 08:38

I am using a sobel filter of size 3x3 to calculate the image derivative. Looking at some articles on the internet, it seems that kernels for sobel filter for size 5x5 and 7x

9条回答
  •  栀梦
    栀梦 (楼主)
    2020-12-02 09:07

    Thanks for all, I will try second variant by @Adam Bowen, take C# code for Sobel5x5, 7x7, 9x9... matrix generaion for this variant (maybe with bugs, if you find bug or can optimize code - write it there):

        static void Main(string[] args)
        {
            float[,] Sobel3x3 = new float[,] {
                {-1, 0, 1},
                {-2, 0, 2},
                {-1, 0, 1}};
    
            float[,] Sobel5x5 = Conv2DforSobelOperator(Sobel3x3);
            float[,] Sobel7x7 = Conv2DforSobelOperator(Sobel5x5);
            Console.ReadKey();
        }
    
        public static float[,] Conv2DforSobelOperator(float[,] Kernel)
        {
            if (Kernel == null)
                throw new Exception("Kernel = null");
    
            if (Kernel.GetLength(0) != Kernel.GetLength(1))
                throw new Exception("Kernel matrix must be Square matrix!");
    
            float[,] BaseMatrix = new float[,] {
                {1, 2, 1},
                {2, 4, 2},
                {1, 2, 1}};
    
            int KernelSize = Kernel.GetLength(0);
            int HalfKernelSize = KernelSize / 2;
            int OutSize = KernelSize + 2;
    
            if ((KernelSize & 1) == 0) // Kernel_Size must be: 3, 5, 7, 9 ...
                throw new Exception("Kernel size must be odd (3x3, 5x5, 7x7...)");
    
            float[,] Out = new float[OutSize, OutSize];
            float[,] InMatrix = new float[OutSize, OutSize];
    
            for (int x = 0; x < BaseMatrix.GetLength(0); x++)
                for (int y = 0; y < BaseMatrix.GetLength(1); y++)
                    InMatrix[HalfKernelSize + x, HalfKernelSize + y] = BaseMatrix[x, y];
    
            for (int x = 0; x < OutSize; x++)
                for (int y = 0; y < OutSize; y++)
                    for (int Kx = 0; Kx < KernelSize; Kx++)
                        for (int Ky = 0; Ky < KernelSize; Ky++)
                        {
                            int X = x + Kx - HalfKernelSize;
                            int Y = y + Ky - HalfKernelSize;
    
                            if (X >= 0 && Y >= 0 && X < OutSize && Y < OutSize)
                                Out[x, y] += InMatrix[X, Y] * Kernel[KernelSize - 1 - Kx, KernelSize - 1 - Ky];
                        }
            return Out;
        }
    

    Results (NormalMap) or it copy there, where this metod - №2, @Paul R metod - №1. Now I am using last, becouse it give more smooth result and it's easy to generate kernels with this code.

提交回复
热议问题