using System;
using OpenCvSharp;
namespace 輪郭抽出 {
class Program {
static void Main(string[] args) {
Mat src = new Mat(@"D:\picture.png");
Cv2.CvtColor(src, src, ColorConversionCodes.BGR2GRAY);
Mat bibun = new Mat(),
prewitt = new Mat(),
sobel = new Mat(),
laplacian = new Mat(),
emboss = new Mat(),
canny = new Mat(),
roberts = new Mat();
Mat bibunX = new Mat();
Mat bibunKernelX = new Mat(3, 3, MatType.CV_32FC1,
new float[,] {
{ 0, 0, 0 },
{ -1, 0, 1 },
{ 0, 0, 0 }
});
Mat bibunY = new Mat();
Mat bibunKernelY = new Mat(3, 3, MatType.CV_32FC1,
new float[,] {
{ 0, -1, 0 },
{ 0, 0, 0 },
{ 0, 1, 0 }
});
Cv2.Filter2D(src, bibunX, MatType.CV_32FC1, bibunKernelX);
Cv2.Filter2D(src, bibunY, MatType.CV_32FC1, bibunKernelY);
Cv2.Sqrt(bibunX.Pow(2) + bibunY.Pow(2), bibun);
Mat prewittX = new Mat();
Mat prewittKernelX = new Mat(3, 3, MatType.CV_32FC1,
new float[,] {
{ -1, 0, 1 },
{ -1, 0, 1 },
{ -1, 0, 1 }
});
Mat prewittY = new Mat();
Mat prewittKernelY = new Mat(3, 3, MatType.CV_32FC1,
new float[,] {
{ -1, -1, -1 },
{ 0, 0, 0 },
{ 1, 1, 1 }
});
Cv2.Filter2D(src, prewittX, MatType.CV_32FC1, prewittKernelX);
Cv2.Filter2D(src, prewittY, MatType.CV_32FC1, prewittKernelY);
Cv2.Sqrt(prewittX.Pow(2) + prewittY.Pow(2), prewitt);
Mat sobelX = new Mat();
Cv2.Sobel(src, sobelX, MatType.CV_32FC1, 1, 0);
Mat sobelY = new Mat();
Cv2.Sobel(src, sobelY, MatType.CV_32FC1, 0, 1);
Cv2.Sqrt(sobelX.Pow(2) + sobelY.Pow(2), sobel);
int ksize = 3;
Cv2.Laplacian(src, laplacian, MatType.CV_32FC1, ksize);
Mat embossKernel = new Mat(3, 3, MatType.CV_32FC1,
new float[,] {
{-2, -1, 0},
{-1, 1, 1},
{ 0, 1, 2}
});
Cv2.Filter2D(src, emboss, MatType.CV_32FC1, embossKernel);
double minThresh = 100;
double maxThresh = 200;
Cv2.Canny(src, canny, minThresh, maxThresh);
Cv2.ImShow("入力画像", src);
Cv2.ImShow("一次微分", bibun);
Cv2.ImShow("Prewitt", prewitt);
Cv2.ImShow("Sobel", sobel);
Cv2.ImShow("Laplacian", laplacian);
Cv2.ImShow("Emboss", emboss);
Cv2.ImShow("Canny", canny);
Cv2.WaitKey();
}
}
}