索贝尔算法

时间:2017-06-03 18:22:36

标签: c# image-processing

我正在尝试实施Sobel算法,以便从图像中检测边缘。

我写了以下代码:

        bmp = new Bitmap(pictureBox1.Image);

        int[][] sobelx = {new int[] {-1, 0, 1},
                          new int[] {-2, 0, 2},
                          new int[] {-1, 0, 1}};

        int[][] sobely = {new int[] {-1, -2, -1},
                          new int[] { 0, 0, 0},
                          new int[] { 1, 2, 1}};

        for (int i = 1; i < bmp.Width - 1; i++)
        {
            for (int j = 1; j < bmp.Height - 1; j++)
            {int dx = bmp.GetPixel(i - 1, j - 1).R * sobelx[0][0] + bmp.GetPixel(i, j - 1).R * sobelx[0][1] + bmp.GetPixel(i + 1, j - 1).R * sobelx[0][2]
                       + bmp.GetPixel(i - 1, j).R * sobelx[1][0] + bmp.GetPixel(i, j).R * sobelx[1][1] + bmp.GetPixel(i + 1, j).R * sobelx[1][2]
                       + bmp.GetPixel(i - 1, j + 1).R * sobelx[2][0] + bmp.GetPixel(i, j + 1).R * sobelx[2][1] + bmp.GetPixel(i + 1, j + 1).R * sobelx[2][2];

                int dy = bmp.GetPixel(i - 1, j - 1).R * sobely[0][0] + bmp.GetPixel(i, j - 1).R * sobely[0][1] + bmp.GetPixel(i + 1, j - 1).R * sobely[0][2]
                       + bmp.GetPixel(i - 1, j).R * sobely[1][0] + bmp.GetPixel(i, j).R * sobely[1][1] + bmp.GetPixel(i + 1, j).R * sobely[1][2]
                       + bmp.GetPixel(i - 1, j + 1).R * sobely[2][0] + bmp.GetPixel(i, j + 1).R * sobely[2][1] + bmp.GetPixel(i + 1, j + 1).R * sobely[2][2];
                double derivata = Math.Sqrt((dx * dx) + (dy * dy));

                if (derivata > 255)
                {
                    bmp.SetPixel(i, j, Color.White);
                }
                else
                {
                    bmp.SetPixel(i, j, Color.FromArgb(255, (int)derivata, (int)derivata, (int)derivata));
                }
            }
        }

        pictureBox2.Image = bmp;

但结果图像大多是白色的。 这是原始图片: Original image

这是转换后的图像:

Transformed image

我不知道自己做错了什么。有谁可以帮助我?

先谢谢你了!

1 个答案:

答案 0 :(得分:1)

使用另一个位图保存输出,如下所示:

import UIKit
import CoreLocation

public class ViewController { //class where you need to set the label's text

    //your code here

    }
}

extension YouAnnotationClass {
    var distanceToUsersCurrentLocation: Double {
        let manager = CLLocationManager() //location manager for user's current location
        let destinationCoordinates = CLLocation(latitude: self.latitude, longitude: self.longitude) //coordinates for destinastion
        let selfCoordinates = CLLocation(latitude: (manager.location?.coordinate.latitude)!, longitude: (manager.location?.coordinate.longitude)!) //user's location
        return selfCoordinates.distance(from: destinationCoordinates) //return distance in **meters**
}