/// <summary>ラベルの包含関係を調べる</summary> /// <param name="label">ラベリングデータ</param> /// <param name="token">キャンセルトークン</param> /// <returns>包含関係</returns> public int[][] GetInclusionLink(LabelStructure label, CancellationTokenSource token) { logWriter.Write("ラベルの包含関係を調べます"); if (label == null) { logWriter.WriteError("ラベル情報がありません"); logWriter.WriteError("処理を中止します"); return(null); } label.SetMinMax(); int[][] link = new int[label.Max - label.Min + 1][]; using (PrograssWindow pw = new PrograssWindow("包含検査", label.Max - label.Min + 1)) { Parallel.For(label.Min, label.Max + 1, (n, state) => { if (token.IsCancellationRequested) { state.Break(); } link[n - label.Min] = GetInclusionNumber3(label, n); pw.Add(); }); } logWriter.Write("ラベルの包含関係を調べました"); return(link); }
/// <summary>ラベル情報を視覚化する</summary> /// <param name="label">視覚化したいラベルデータ</param> /// <returns>視覚化された画像<see cref="Bitmap"/></returns> private Bitmap GetLabelImage(LabelStructure label) { logWriter.Write("ラベルデータの画像作成を行います"); if (label == null) { logWriter.WriteError("ラベルデータが存在しません"); logWriter.WriteError("画像作成を中止します"); return(null); } Bitmap bitmap = new Bitmap(label.Width, label.Height); label.SetMinMax(); int val = label.Max - label.Min + 1; int c = (byte.MaxValue + 1) / val; if (c == 0) { c = 16; } logWriter.Write("分割数 =" + val); logWriter.Write("色の変化量=" + c); { BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); byte[] buf = new byte[bitmap.Width * bitmap.Height * 4]; Marshal.Copy(data.Scan0, buf, 0, buf.Length); for (int y = 0; y < bitmap.Height; y++) { for (int x = 0; x < bitmap.Width; x++) { int index = y * bitmap.Width * 4 + x * 4; int color = label[y, x] * c; buf[index + 0] = buf[index + 1] = buf[index + 2] = (byte)color; buf[index + 3] = byte.MaxValue; } } Marshal.Copy(buf, 0, data.Scan0, buf.Length); bitmap.UnlockBits(data); } logWriter.Write("ラベルデータの画像作成が完了しました"); return(bitmap); }
/// <summary>画像を保存します</summary> /// <param name="image">画像</param> /// <param name="depth">深さ</param> private void SaveImage(Bitmap image, LabelStructure depth) { DialogResult com = MessageBox.Show("3次元画像を保存しますか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (com == DialogResult.Yes) { SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.Filter = "3次元画像|*.rgbad;*.txt"; saveDialog.Title = "保存"; saveDialog.DefaultExt = "rgbad"; if (saveDialog.ShowDialog() == DialogResult.OK) { string path = Path.GetDirectoryName(saveDialog.FileName) + "\\" + Path.GetFileNameWithoutExtension(saveDialog.FileName); SaveImage saveImage = new SaveImage(logWriter); saveImage.Save(image, depth, path + ".txt"); saveImage.SaveBinary(image, depth, path + ".rgbad"); depth.SetMinMax(); saveImage.SaveChip(image, depth, path); } } }