1: public partial class Form1 : Form {
2:
3: public enum eColor { roof, lawn, garden, street, tree, unknown, mix };
4:
5: public static string colorValue_white = "ffffffff";
6:
7: public int MaskSize = 3;
8:
9: Dictionary<Color, eColor> myDictionary = new Dictionary<Color, eColor>();
10:
11: public Form1() {
12: InitializeComponent();
13: }
14:
15: private void Form1_Load(object sender, EventArgs e) {
16:
17: }
18:
19: private Bitmap SwitchPixel(Bitmap bmOriginal) {
20:
21: // Create a Bitmap object from a file.
22: Bitmap myBitmap = new Bitmap(bmOriginal.Width, bmOriginal.Height);
23:
24: Color cOut = Color.White;
25: // cOld = Color.White;
26:
27: // Set each pixel in myBitmap to the right default color
28: for (int Xcount = 0; Xcount < bmOriginal.Width; Xcount++) {
29: for (int Ycount = 0; Ycount < bmOriginal.Height; Ycount++) {
30: // Get pixel color
31: Color c = bmOriginal.GetPixel(Xcount, Ycount);
32:
33: if (myDictionary.ContainsKey(c)) {
34: if (c.Name == colorValue_white) {
35: cOut = Color.Black;
36: }
37: else {
38: switch (myDictionary[c]) {
39: case eColor.lawn:
40: cOut = Color.Green;
41: break;
42: case eColor.roof:
43: cOut = Color.Red;
44: break;
45: case eColor.street:
46: cOut = Color.Gray;
47: break;
48: case eColor.garden:
49: cOut = Color.Pink;
50: break;
51: case eColor.tree:
52: cOut = Color.DarkOliveGreen;
53: break;
54: case eColor.mix:
55: cOut = Color.Orange;
56: break;
57: default:
58: cOut = Color.White;
59: break;
60: }
61: }
62: }
63: else {
64: cOut = Color.White;
65: }
66: myBitmap.SetPixel(Xcount, Ycount, cOut);
67: }
68: }
69: return myBitmap;
70: }
71:
72: private Bitmap FillAsLawn(Bitmap bmOriginal) {
73:
74: // Create a Bitmap object from a file.
75: Bitmap myBitmap = new Bitmap(bmOriginal.Width, bmOriginal.Height);
76:
77: // Set each pixel in myBitmap to the right default color
78: for (int Xcount = 0; Xcount < bmOriginal.Width; Xcount++) {
79: for (int Ycount = 0; Ycount < bmOriginal.Height; Ycount++) {
80: Color c = bmOriginal.GetPixel(Xcount, Ycount);
81: if (c.ToArgb() == Color.White.ToArgb()) { c = Color.Green; }
82: myBitmap.SetPixel(Xcount, Ycount, c);
83: }
84: }
85: return myBitmap;
86: }
87:
88: private Bitmap RemoveSaltAndPepperRumor(Bitmap bmOriginal) {
89: int WhitePx = 0;
90:
91: // Create a Bitmap object from a file.
92: Bitmap myBitmap = new Bitmap(bmOriginal.Width, bmOriginal.Height);
93: // Set each pixel in myBitmap to the right default color
94: for (int Xcount = 0 + MaskSize; Xcount < (bmOriginal.Width - MaskSize); Xcount++) {
95: for (int Ycount = 0 + MaskSize; Ycount < (bmOriginal.Height - MaskSize); Ycount++) {
96: // Get pixel color
97: Color c = bmOriginal.GetPixel(Xcount, Ycount);
98: // Se il colore è arancione (mix color)
99: // Oppure bianco (che non è di nessuno)
100: // entro nella maschera che mi decide di chi è il px
101: if ((c.ToArgb() == Color.Orange.ToArgb()) || (c.ToArgb() == Color.White.ToArgb())) {
102: List<Color> tempList = new List<Color>(MaskSize * 4);
103: int HalfMaskSize = MaskSize / 2;
104: bool RightColor = false;
105: // Finchè non trovo un colore che mi soddisfa resto nel ciclo
106: int maxValue = 0;
107: try {
108: while (RightColor == false) {
109: // Riempio una lista con i colori della maschera
110: // In base alla maschera parto da un 3x3 poi faccio un 5x5 ed infine un 7x7
111: for (int i = (Xcount - HalfMaskSize); i <= (Xcount + HalfMaskSize); i++) {
112: for (int j = (Ycount - HalfMaskSize); j <= (Ycount + HalfMaskSize); j++) {
113: Color tempColor = bmOriginal.GetPixel(i, j);
114: tempList.Add(tempColor);
115: }
116: }
117: // In base alla lista che gli passo mi restituisce il colore maggiore
118: c = MediumFilter(tempList);
119: // Se il colore mi fa bene esco dal ciclo
120: // Se invece il colore non va bene (poichè è arancio o bianco)
121: // Allargo la maschera e riprovo
122: // quando sono al max (ovvero la maschera 7x7 setto il colore di prato
123: if ((c.ToArgb() != Color.Orange.ToArgb()) && (c.ToArgb() != Color.White.ToArgb())) {
124: RightColor = true;
125: }
126: if (HalfMaskSize > 2) {
127: c = Color.White;
128: WhitePx++;
129: //c = Color.Green;
130: break;
131: }
132: // Controllo che la maschera non sfori i bordi!
133: if (Xcount + HalfMaskSize + 2 > bmOriginal.Width) { break; }
134: if (Ycount + HalfMaskSize + 2 > bmOriginal.Height) { break; }
135: HalfMaskSize += 1;
136:
137: maxValue++;
138: if (maxValue > 50) {
139: break;
140: }
141: }
142: tempList.Clear();
143: }
144: catch { c = Color.Lime; }
145: }
146: myBitmap.SetPixel(Xcount, Ycount, c);
147: }
148: }
149:
150: lblCountWhitePx.Text = lblCountWhitePx.Text + " , " + WhitePx;
151: return myBitmap;
152: }
153:
154: private Color MediumFilter(List<Color> myList) {
155:
156: int countGreen = 0;
157: int countRed = 0;
158: int countGray = 0;
159: int countPink = 0;
160: int countDarkOliveGreen = 0;
161: int countOrange = 0;
162: int countWhite = 0;
163: int countBlack = 0;
164:
165: foreach (Color c in myList) {
166: if (c.ToArgb() == Color.Black.ToArgb()) { countBlack++; continue; }
167: if (c.ToArgb() == Color.Green.ToArgb()) { countGreen++; continue; }
168: if (c.ToArgb() == Color.Red.ToArgb()) { countRed++; continue; }
169: if (c.ToArgb() == Color.Gray.ToArgb()) { countGray++; continue; }
170: if (c.ToArgb() == Color.Pink.ToArgb()) { countPink++; continue; }
171: if (c.ToArgb() == Color.DarkOliveGreen.ToArgb()) { countDarkOliveGreen++; continue; }
172: if (c.ToArgb() == Color.Orange.ToArgb()) { countOrange++; continue; }
173: if (c.ToArgb() == Color.White.ToArgb()) { countWhite++; continue; }
174: }
175:
176: for (int i = myList.Count; i >= 0; i--) {
177: if (countBlack == i) return Color.Black;
178: if (countGreen == i) return Color.Green;
179: if (countRed == i) return Color.Red;
180: if (countGray == i) return Color.Gray;
181: if (countPink == i) return Color.Pink;
182: if (countDarkOliveGreen == i) return Color.DarkOliveGreen;
183: if (countOrange == i) return Color.Orange;
184: if (countWhite == i) return Color.White;
185: }
186:
187: return Color.Gold;
188:
189:
190:
191:
192:
193: }
194:
195: private void SetDictionaryColor(Bitmap _bitmap, eColor _eColorName) {
196: for (int x = 0; x < _bitmap.Width; x++) {
197: for (int y = 0; y < _bitmap.Height; y++) {
198: // Get pixel color
199: Color c = _bitmap.GetPixel(x, y);
200: // ho una variabile dizionario con la coppia Colore - Costante
201: // Per ogni px guardo se il colore preso è nel dizionario ...
202: // se c'è faccio un ulteriore controllo, se non c'è lo aggiungo nel dizionario.
203: if (myDictionary.ContainsKey(c)) {
204: eColor tempvalue = myDictionary[c];
205: // se il valore è già presente:
206: // se il suo enum colore è uguale a passato nella funzione - tutto bene non faccio niente (non ci sono conflitti)
207: // se è diverso allo vuol dire che c'è stato un conflito (setto la coppia colore-mix per indicare che questo colore
208: // è condiviso tra più aree)
209: if (tempvalue.Equals(_eColorName) == false) {
210: myDictionary[c] = eColor.mix;
211: }
212: }
213: else {
214: myDictionary.Add(c, _eColorName);
215: }
216: }
217: }
218: }
219:
220: private void button1_Click(object sender, EventArgs e) {
221:
222: try {
223: // Immagine originale
224: Bitmap bmOriginal = new Bitmap(picOriginal.Image);
225:
226: // Tetto
227: Bitmap bmRoof = new Bitmap(picColorsRoot.Image);
228: SetDictionaryColor(bmRoof, eColor.roof);
229: bmRoof = null;
230:
231: // Orto
232: Bitmap bmGarden = new Bitmap(picColorsGarden.Image);
233: SetDictionaryColor(bmGarden, eColor.garden);
234: bmGarden = null;
235:
236: // Prato
237: Bitmap bmLawn = new Bitmap(picColorsLawn.Image);
238: SetDictionaryColor(bmLawn, eColor.lawn);
239: bmLawn = null;
240:
241: // Strada
242: Bitmap bmStreet = new Bitmap(picColorsStreet.Image);
243: SetDictionaryColor(bmStreet, eColor.street);
244: bmStreet = null;
245:
246: // Alberi
247: Bitmap bmTree = new Bitmap(picColorsTree.Image);
248: SetDictionaryColor(bmTree, eColor.tree);
249: bmTree = null;
250:
251: // Divide l'immagine nei diversi colori in base al colore
252: picFirstOutput.Image = SwitchPixel(bmOriginal);
253: myDictionary = null;
254:
255: // Immagine Originale
256: Bitmap bmStep1 = new Bitmap(picFirstOutput.Image);
257: picFirstOutput.Image = picMedianFilter.Image = RemoveSaltAndPepperRumor(bmStep1);
258:
259: // Ciclo del filtro
260: for (int i = 0; i < 20; i++) {
261: Bitmap bmStep = new Bitmap(picMedianFilter.Image);
262: picMedianFilter.Image = RemoveSaltAndPepperRumor(bmStep);
263: picMedianFilter.Refresh();
264: lblFitro.Text = "filtro n:" + i;
265: lblFitro.Refresh();
266: bmStep.Save("C:\\Francesco\\RegionGrowing" + i + ".Jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
267: }
268:
269: //Ultimo giro del filtro
270: Bitmap bmLastStep = new Bitmap(picMedianFilter.Image);
271: picLastMedianFilter.Image = FillAsLawn(bmLastStep);
272:
273: Bitmap bmSaveLastStep = new Bitmap(picLastMedianFilter.Image);
274: bmSaveLastStep.Save("C:\\Francesco\\RegionGrowingLast.Jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
275: bmSaveLastStep.Save("C:\\Francesco\\RegionGrowingLast.Bmp", System.Drawing.Imaging.ImageFormat.Bmp);
276:
277: //---------------------
278:
279: CalculateArea(bmSaveLastStep);
280:
281: }
282: catch {
283:
284: }
285:
286: }
287:
288: private void button2_Click(object sender, EventArgs e) {
289:
290: // Immagine originale
291: Bitmap bmOriginal = new Bitmap(picOriginal.Image);
292: int NpxImmagine = bmOriginal.Width * bmOriginal.Height;
293: textBox1.AppendText("px totali immagine originale: " + NpxImmagine + Environment.NewLine);
294:
295: // Immagine legenda
296: Bitmap bmLegend = new Bitmap(picLegend.Image);
297: int NpxLegenda = bmLegend.Width * bmLegend.Height;
298: textBox1.AppendText("px totali legenda: " + NpxLegenda + Environment.NewLine);
299:
300: //Ultimo giro del filtro
301: Bitmap bmLastStep = new Bitmap(picLastMedianFilter.Image);
302: int NpxOutPutImages = bmLastStep.Width * bmLastStep.Height;
303: textBox1.AppendText("px totali immagine finale: " + NpxOutPutImages + Environment.NewLine);
304:
305: CalculateArea(bmLastStep);
306:
307: }
308:
309: public void CalculateArea(Bitmap bmOriginal) {
310:
311: int total = 0;
312: int countGreen = 0;
313: int countRed = 0;
314: int countGray = 0;
315: int countPink = 0;
316: int countDarkOliveGreen = 0;
317: int countOrange = 0;
318: int countWhite = 0;
319: int countBlack = 0;
320: int error = 0;
321:
322: // Set each pixel in myBitmap to the right default color
323: for (int Xcount = 0; Xcount < bmOriginal.Width; Xcount++) {
324: for (int Ycount = 0; Ycount < bmOriginal.Height; Ycount++) {
325: total++;
326: // Get pixel color
327: Color c = bmOriginal.GetPixel(Xcount, Ycount);
328: if (c.ToArgb() == Color.Black.ToArgb()) { countBlack++; continue; }
329: if (c.ToArgb() == Color.Green.ToArgb()) { countGreen++; continue; }
330: if (c.ToArgb() == Color.Red.ToArgb()) { countRed++; continue; }
331: if (c.ToArgb() == Color.Gray.ToArgb()) { countGray++; continue; }
332: if (c.ToArgb() == Color.Pink.ToArgb()) { countPink++; continue; }
333: if (c.ToArgb() == Color.DarkOliveGreen.ToArgb()) { countDarkOliveGreen++; continue; }
334: if (c.ToArgb() == Color.Orange.ToArgb()) { countOrange++; continue; }
335: if (c.ToArgb() == Color.White.ToArgb()) { countWhite++; continue; }
336: error++;
337: }
338: }
339:
340: textBox1.AppendText(Environment.NewLine);
341:
342:
343: textBox1.AppendText("countGreen: " + countGreen + Environment.NewLine);
344: textBox1.AppendText("countRed: " + countRed + Environment.NewLine);
345: textBox1.AppendText("countGray: " + countGray + Environment.NewLine);
346: textBox1.AppendText("countPink: " + countPink + Environment.NewLine);
347: textBox1.AppendText("countDarkOliveGreen: " + countDarkOliveGreen + Environment.NewLine);
348: textBox1.AppendText("countOrange: " + countOrange + Environment.NewLine);
349: textBox1.AppendText("countWhite: " + countWhite + Environment.NewLine);
350: textBox1.AppendText("countBlack: " + countBlack + Environment.NewLine);
351: textBox1.AppendText("error: " + error + Environment.NewLine);
352: textBox1.AppendText("totalPx: " + total + Environment.NewLine);
353:
354:
355: }
356:
357: }