Form1.cs
5.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
using AOI;
using OpenCvSharp;
using OpenCvSharp.Blob;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net.Http.Headers;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
using static System.Windows.Forms.MonthCalendar;
namespace 园晶斑点分析测试
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
var src = System.Drawing.Image.FromFile("d:\\logs\\t10_2.jpg");
var src2 = System.Drawing.Image.FromFile("d:\\logs\\t10.jpg");
//var src = System.Drawing.Image.FromFile("d:\\hbyj.png");
//var bck = System.Drawing.Image.FromFile("d:\\blank.png");
Mat srcMat = ImageUtil.ToMat(src);
//Cv2.Resize(srcMat, srcMat, new OpenCvSharp.Size(src.Width / 3, src.Height / 3), 0, 0, InterpolationFlags.Area);
Mat srcMat2 = ImageUtil.ToMat(src2);
//Cv2.Resize(srcMat2, srcMat2, new OpenCvSharp.Size(src.Width / 3, src.Height / 3), 0, 0, InterpolationFlags.Area);
// Mat bckMat = ImageUtil.ToMat(bck);
Mat threshMat = new Mat();
Cv2.CvtColor(srcMat, threshMat, ColorConversionCodes.RGB2GRAY);
ThresholdTypes threshType = ThresholdTypes.Binary;
Cv2.Threshold(threshMat, threshMat, 120, 255, threshType);
Cv2.GaussianBlur(threshMat, threshMat, new OpenCvSharp.Size(5, 5),0);
Cv2.AddWeighted(threshMat, 1.5, threshMat, -0.5, 0, threshMat);
//Cv2.Threshold(threshMat, threshMat, 60, 255, threshType);
//Cv2.ImShow("ddd", threshMat);
Cv2.CvtColor(srcMat2, srcMat2, ColorConversionCodes.RGB2GRAY);
srcMat2 = HighPassFilter(srcMat2, 5, 6, 10);
Cv2.Threshold(srcMat2, srcMat2, 140, 255, threshType);
Cv2.GaussianBlur(srcMat2, srcMat2, new OpenCvSharp.Size(3, 3), 200);
Cv2.GaussianBlur(srcMat2, srcMat2, new OpenCvSharp.Size(3, 3), 200);
Cv2.Threshold(srcMat2, srcMat2, 30, 255, threshType);
Cv2.ImShow("www", srcMat2);
return;
//CvBlobs blobs = new CvBlobs();
////blobs.FilterByArea(200, 255);
//blobs.Label(threshMat);
//var blobList = blobs.Values.ToList();
////Mat im_with_keypoints = ImageUtil.ToMat(bck);
//foreach (var pair in blobList)
//{
// CvBlob blob = pair;
// Cv2.Circle(srcMat, (int)blob.Centroid.X, (int)blob.Centroid.Y, 1, Scalar.FromRgb(255, 0, 0), 1);
//}
//Cv2.ImShow("ccc", srcMat);
////return;
var cparams = new SimpleBlobDetector.Params();
cparams.ThresholdStep = 2;
cparams.FilterByColor = true;
cparams.BlobColor = 255;
cparams.MinRepeatability = 8;
cparams.MinDistBetweenBlobs = 10;
// 改变阈值
cparams.MinThreshold = 40;
cparams.MaxThreshold = 255;
// 通过面积滤波
cparams.FilterByArea = true;
cparams.MinArea = 0.1f;
// 通过圆度滤波
//cparams.FilterByCircularity = true;
//cparams.MinCircularity = 0.1f;
// 通过凸度滤波
cparams.FilterByConvexity = true;
cparams.MinConvexity = 0.5f;
// 通过惯性比滤波
//cparams.FilterByInertia = true;
//cparams.MinInertiaRatio = 0.01f;
Mat mask = new Mat(threshMat.Size(),MatType.CV_8U,1);
mask.SetTo(new Scalar(0));
Cv2.Rectangle(mask,new Rect(1064,152,1356,2424), new Scalar(255), -1);
SimpleBlobDetector simpleBlob = SimpleBlobDetector.Create(cparams);
var keypoints = simpleBlob.Detect(threshMat, mask);
////Mat im_with_keypoints = new Mat();
//Cv2.CvtColor(threshMat, im_with_keypoints, ColorConversionCodes.GRAY2RGB);
Cv2.DrawKeypoints(threshMat, keypoints, srcMat2, Scalar.FromRgb(255, 0, 0), DrawMatchesFlags.DrawOverOutImg);
Cv2.PutText(srcMat2, $"{keypoints.Length}", new OpenCvSharp.Point(1064, 152), HersheyFonts.HersheySimplex, 4, Scalar.Red,4);
Cv2.ImShow("bbb", srcMat2);
Cv2.ImWrite("d:\\logs\\t10_result.jpg",srcMat2);
//var dstCutImg = ImageUtil.ToImage(threshMat);
}
static Mat HighPassFilter(Mat src, int ksize, double sigma, double contrast)
{
Mat dst = new Mat();
Mat kernel = Cv2.GetGaussianKernel(ksize, sigma);
kernel *= contrast;
kernel.Set<double>(ksize / 2, ksize / 2, kernel.At<double>(ksize / 2, ksize / 2) - contrast + 1);
Cv2.Filter2D(src, dst, -1, kernel);
return dst;
}
}
}