1

Sobel Filter を自分で実装したい (実際には美しい実装ではありません)。しかし、畳み込みを行った後、RGB値を計算する方法がわかりません。

  • 仮定: グレースケール画像

    double [][] sobel_x = 
    {
        { -1, 0, 1},
        { -2, 0, 2},
        { -1, 0, 1}
    };
    
    double [][]    sobel_y = 
    {
        { 1, 2, 1},
        { 0, 0, 0},
        {-1, -2, 1}
    };
    
    for(int y=1; y<image.getHeight()-1; y++)
    {
        for(int x=1; x<image.getWidth()-1; x++)
        {
           Color a = new Color(image.getRGB(x-1, y-1));
           Color b = new Color(image.getRGB(x, y-1));
           Color c = new Color(image.getRGB(x+1, y-1));
           Color d = new Color(image.getRGB(x-1, y));
           Color e = new Color(image.getRGB(x, y));
           Color f = new Color(image.getRGB(x+1, y));
           Color g = new Color(image.getRGB(x-1, y+1));
           Color h = new Color(image.getRGB(x, y+1));
           Color i = new Color(image.getRGB(x+1, y+1));
    
            double pixel_x =    (sobel_x[0][0] * a.getRed()) + (sobel_x[0][1] * b.getRed()) + (sobel_x[0][2] * c.getRed()) +
                                (sobel_x[1][0] * d.getRed())   + (sobel_x[1][1] * e.getRed())   + (sobel_x[1][2] * f.getRed()) +
                                (sobel_x[2][0] * g.getRed()) + (sobel_x[2][1] * h.getRed()) + (sobel_x[2][2] * i.getRed());
            double pixel_y = 
                                (sobel_y[0][0] * a.getRed()) + (sobel_x[0][1] * b.getRed()) + (sobel_x[0][2] * c.getRed()) +
                                (sobel_y[1][0] * d.getRed())   + (sobel_x[1][1] * e.getRed())   + (sobel_x[1][2] * f.getRed()) +
                                (sobel_y[2][0] * g.getRed()) + (sobel_x[2][1] * h.getRed()) + (sobel_x[2][2] * i.getRed());  
    
            //Here it is possible to get values between [-1020, 1020]       
    
            //How to going on
    
            //int rgb = (int) Math.sqrt(pixel_x*pixel_x+pixel_y*pixel_y);
    
            //int rgbAsInt = (int)(65536 * rgb + 256 * rgb + rgb);      
        }
    }   
    
4

2 に答える 2

0

私のアイデアの 1 つは、線形変換を行うことです。たとえば、取得した画像のピクセル値の最小値は -998 で、最大値は 1000 でした。つまり、-998 を 0 に、1000 を 255 に対応させて、(-998,1000) のスケールと(0,255) のスケールで、[-998,1000] から [0,255] までのすべての値を正規化します。

于 2015-07-22T17:49:29.570 に答える