Esempio n. 1
0
        /// <summary>
        /// 画像をピクチャボックスのサイズに合わせて全体に表示するアフィン変換行列を求める
        /// </summary>
        /// <param name="mat">アフィン変換行列</param>
        /// <param name="image">画像データ</param>
        /// <param name="dst">描画先のピクチャボックス</param>
        private void ZoomFit(
            ref System.Drawing.Drawing2D.Matrix mat,
            ImagingSolution.Imaging.ImageData image,
            PictureBox dst)
        {
            // アフィン変換行列の初期化(単位行列へ)
            mat.Reset();

            int srcWidth  = image.Width;
            int srcHeight = image.Height;
            int dstWidth  = dst.Width;
            int dstHeight = dst.Height;

            float scale;

            // 縦に合わせるか?横に合わせるか?
            if (srcHeight * dstWidth > dstHeight * srcWidth)
            {
                // ピクチャボックスの縦方法に画像表示を合わせる場合
                scale = dstHeight / (float)srcHeight;
                mat.Scale(scale, scale, System.Drawing.Drawing2D.MatrixOrder.Append);
                // 中央へ平行移動
                mat.Translate((dstWidth - srcWidth * scale) / 2f, 0f, System.Drawing.Drawing2D.MatrixOrder.Append);
            }
            else
            {
                // ピクチャボックスの横方法に画像表示を合わせる場合
                scale = dstWidth / (float)srcWidth;
                mat.Scale(scale, scale, System.Drawing.Drawing2D.MatrixOrder.Append);
                // 中央へ平行移動
                mat.Translate(0f, (dstHeight - srcHeight * scale) / 2f, System.Drawing.Drawing2D.MatrixOrder.Append);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// マウスポインタの位置の画像の輝度値を表示
        /// </summary>
        /// <param name="mat">画像を表示しているアフィン変換行列</param>
        /// <param name="image">表示している画像</param>
        /// <param name="pointPictureBox">表示先のピクチャボックス</param>
        private void DispPixelInfo(System.Drawing.Drawing2D.Matrix mat,
                                   ImagingSolution.Imaging.ImageData image, PointF pointPictureBox)
        {
            if (image == null)
            {
                return;
            }

            // ピクチャボックス→画像上の座標のアフィン変換行列
            var matInvert = mat.Clone();

            matInvert.Invert();

            // 画像上の座標
            var pointImage = new PointF[1];

            pointImage[0] = pointPictureBox;
            matInvert.TransformPoints(pointImage);

            int picX = (int)Math.Floor(pointImage[0].X + 0.5);
            int picY = (int)Math.Floor(pointImage[0].Y + 0.5);

            string bright = " = ";

            if (
                (picX >= 0) &&              // ポインタ座標が画像の範囲内の場合
                (picY >= 0) &&
                (picX < image.Width) &&
                (picY < image.Height) &&
                (image.ImageBit >= 24)    // カラー画像の場合
                )
            {
                bright += "(" +
                          image[picY, picX, 2].ToString() + ", " + // R
                          image[picY, picX, 1].ToString() + ", " + // G
                          image[picY, picX, 0].ToString() + ")";   // B
            }
            else
            {
                bright += image[picY, picX].ToString();
            }

            // 輝度値の表示(モノクロを除く)

            /**
             * lblPixelInfo.Text =
             *  "(" +
             *  picX.ToString() + ", " +
             *  picY.ToString() + ")" +
             *  bright;
             **/
        }
Esempio n. 3
0
        /// <summary>
        /// 画像ファイルを開く
        /// </summary>
        /// <param name="filename">画像ファイルのパス</param>
        private void OpenImageFile(string filename)
        {
            if (IsImageFile(filename) == false)
            {
                return;
            }

            // 画像データの確保
            if (_img != null)
            {
                _img.Dispose();
            }
            if (_bmp != null)
            {
                _bmp.Dispose();
            }
            _img = new ImagingSolution.Imaging.ImageData(filename);
            // 表示用
            _bmp = _img.ToBitmap();

            // 画像サイズ
            lblImageInfo.Text =
                _img.Width.ToString() + " x " +
                _img.Height.ToString() + " x " +
                _img.ImageBit.ToString() + "bit";

            // 表示する画像の領域
            _srcRect = new RectangleF(-0.5f, -0.5f, _img.Width, _img.Height);
            // 描画元を指定する3点の座標(左上、右上、左下の順)
            _srcPoints[0] = new PointF(_srcRect.Left, _srcRect.Top);
            _srcPoints[1] = new PointF(_srcRect.Right, _srcRect.Top);
            _srcPoints[2] = new PointF(_srcRect.Left, _srcRect.Bottom);

            // 画像全体を表示
            ZoomFit(ref _matAffine, _img, picImage);
            // 画像の描画
            DrawImage();

            _openedFileName = filename;

            this.Text = System.IO.Path.GetFileName(filename) + " - ImageViewer";
        }
Esempio n. 4
0
        /// <summary>
        /// 画像ファイルを開く
        /// </summary>
        /// <param name="filename">画像ファイルのパス</param>
        private void OpenImageFile(string filename)
        {
            if (IsImageFile(filename) == false)
            {
                return;
            }

            LabelVisualizer();

            // 画像データの確保
            if (_img != null)
            {
                _img.Dispose();
            }
            if (_bmp != null)
            {
                _bmp.Dispose();
            }

            string dirPath = System.IO.Path.GetDirectoryName(filename);

            FileAttributes fa = File.GetAttributes(dirPath);

            fa = fa & ~FileAttributes.ReadOnly;

            File.SetAttributes(filename, fa);


            _img = new ImagingSolution.Imaging.ImageData(filename);//ここで表示できない
            // 表示用
            _bmp = _img.ToBitmap();


            // 画像サイズ

            /**lblImageInfo.Text =
             *  _img.Width.ToString() + " x " +
             *  _img.Height.ToString() + " x " +
             *  _img.ImageBit.ToString() + "bit";
             **/
            // 表示する画像の領域

            _srcRect = new RectangleF(-0.5f, -0.5f, _img.Width, _img.Height);
            // 描画元を指定する3点の座標(左上、右上、左下の順)
            _srcPoints[0] = new PointF(_srcRect.Left, _srcRect.Top);
            _srcPoints[1] = new PointF(_srcRect.Right, _srcRect.Top);
            _srcPoints[2] = new PointF(_srcRect.Left, _srcRect.Bottom);

            if (_fitSizeMode == FitMode.AutoReverse)
            {
                if (_img.Width > _img.Height)
                {
                    _imageOrientation = ImageOrientation.Horizontal;
                }
                else
                {
                    _imageOrientation = ImageOrientation.Vertical;
                }
            }
            else
            {
                /**/
            }

            // 画像全体を表示
            ZoomFit(ref _matAffine, _img, picImage);
            _openedFileName = filename;
            if (_fitSizeMode == FitMode.Horizontal)
            {
                // ImagePullTop();
            }
            // 画像の描画
            DrawImage();

            this.Text = System.IO.Path.GetFileName(filename) + " - RenameAllocateViewer";

            LabelVisualizer();
            // 指定したファイルのディレクトリ
            _fileDirectory = System.IO.Path.GetDirectoryName(filename);
            // ディレクトリ内のファイル一覧
        }

        /// <summary>
        /// リストの最初のファイルを開く
        /// </summary>
        private void OpenImageFIleFirst(string filename)
        {
            // 指定したファイルのディレクトリ
            _fileDirectory = System.IO.Path.GetDirectoryName(filename);
            // ディレクトリ内のファイル一覧
            LimitedList(_fileDirectory);
            OpenImageFile(_openedFileName);
        }

        /// <summary>
        /// 画像の描画
        /// </summary>
        private void DrawImage()
        {
            if (_img == null)
            {
                return;
            }
            if (_bmp == null)
            {
                return;
            }
            // ピクチャボックスのクリア
            _gPicbox.Clear(picImage.BackColor);

            // 描画先の座標をアフィン変換で求める(左上、右上、左下の順)
            PointF[] destPoints = (PointF[])_srcPoints.Clone();
            // 描画先の座標をアフィン変換で求める(変換後の座標は上書きされる)
            _matAffine.TransformPoints(destPoints);
            // 描画
            _gPicbox.DrawImage(
                _bmp,
                destPoints,
                _srcRect,
                GraphicsUnit.Pixel
                );
            // 再描画
            picImage.Refresh();
        }

        /// <summary>
        /// 指定した点(point)周りの拡大縮小
        /// </summary>
        /// <param name="scale">倍率</param>
        /// <param name="point">基準点の座標</param>
        private void ScaleAt(ref System.Drawing.Drawing2D.Matrix mat,
                             float scale, PointF point)
        {
            // 原点へ移動
            mat.Translate(-point.X, -point.Y,
                          System.Drawing.Drawing2D.MatrixOrder.Append);
            // 拡大縮小
            mat.Scale(scale, scale,
                      System.Drawing.Drawing2D.MatrixOrder.Append);
            // 元へ戻す
            mat.Translate(point.X, point.Y,
                          System.Drawing.Drawing2D.MatrixOrder.Append);
        }

        /// <summary>
        /// 画像をピクチャボックスのサイズに合わせて全体に表示するアフィン変換行列を求める
        /// </summary>
        /// <param name="mat">アフィン変換行列</param>
        /// <param name="image">画像データ</param>
        /// <param name="dst">描画先のピクチャボックス</param>
        private void ZoomFit(ref System.Drawing.Drawing2D.Matrix mat,
                             ImagingSolution.Imaging.ImageData image, PictureBox dst)
        {
            // アフィン変換行列の初期化(単位行列へ)
            mat.Reset();

            int srcWidth  = image.Width;
            int srcHeight = image.Height;
            int dstWidth  = dst.Width;
            int dstHeight = dst.Height;

            float scale;

            if (_fitSizeMode == FitMode.Auto)
            {
                // 縦に合わせるか?横に合わせるか?
                if (srcHeight * dstWidth > dstHeight * srcWidth)
                {
                    // ピクチャボックスの縦方法に画像表示を合わせる場合
                    scale = dstHeight / (float)srcHeight;
                    mat.Scale(scale, scale, System.Drawing.Drawing2D.MatrixOrder.Append);
                    // 中央へ平行移動
                    //mat.Translate((dstWidth - srcWidth * scale) / 2f, 0f, System.Drawing.Drawing2D.MatrixOrder.Append);
                    mat.Translate((dstWidth - srcWidth * scale) / 2f, 0f, System.Drawing.Drawing2D.MatrixOrder.Append);
                }
                else
                {
                    // ピクチャボックスの横方法に画像表示を合わせる場合
                    scale = dstWidth / (float)srcWidth;
                    mat.Scale(scale, scale, System.Drawing.Drawing2D.MatrixOrder.Append);
                    // 中央へ平行移動
                    //mat.Translate(0f, (dstHeight - srcHeight * scale) / 2f, System.Drawing.Drawing2D.MatrixOrder.Append);
                    mat.Translate(0f, 0f, System.Drawing.Drawing2D.MatrixOrder.Append);
                }
            }
            else if (_fitSizeMode == FitMode.AutoReverse)
            {
                // 縦に合わせるか?横に合わせるか?
                if (srcHeight * dstWidth < dstHeight * srcWidth)
                {
                    // ピクチャボックスの縦方法に画像表示を合わせる場合
                    scale = dstHeight / (float)srcHeight;
                    mat.Scale(scale, scale, System.Drawing.Drawing2D.MatrixOrder.Append);
                    // 中央へ平行移動
                    //mat.Translate((dstWidth - srcWidth * scale) / 2f, 0f, System.Drawing.Drawing2D.MatrixOrder.Append);
                    mat.Translate((dstWidth - srcWidth * scale) / 2f, 0f, System.Drawing.Drawing2D.MatrixOrder.Append);
                }
                else
                {
                    // ピクチャボックスの横方法に画像表示を合わせる場合
                    scale = dstWidth / (float)srcWidth;
                    mat.Scale(scale, scale, System.Drawing.Drawing2D.MatrixOrder.Append);
                    // 中央へ平行移動
                    //mat.Translate(0f, (dstHeight - srcHeight * scale) / 2f, System.Drawing.Drawing2D.MatrixOrder.Append);
                    mat.Translate(0f, 0f, System.Drawing.Drawing2D.MatrixOrder.Append);
                }
            }
            else if (_fitSizeMode == FitMode.Horizontal)
            {
                // ピクチャボックスの横方法に画像表示を合わせる場合
                scale = dstWidth / (float)srcWidth;
                mat.Scale(scale, scale, System.Drawing.Drawing2D.MatrixOrder.Append);
                // 中央へ平行移動
                //mat.Translate(0f, (dstHeight - srcHeight * scale) / 2f, System.Drawing.Drawing2D.MatrixOrder.Append);
                mat.Translate(0f, 0f, System.Drawing.Drawing2D.MatrixOrder.Append);
            }
            else if (_fitSizeMode == FitMode.Vertical)
            {
                // ピクチャボックスの縦方法に画像表示を合わせる場合
                scale = dstHeight / (float)srcHeight;
                mat.Scale(scale, scale, System.Drawing.Drawing2D.MatrixOrder.Append);
                // 中央へ平行移動
                mat.Translate((dstWidth - srcWidth * scale) / 2f, 0f, System.Drawing.Drawing2D.MatrixOrder.Append);
            }
        }

        /// <summary>
        /// ソートメソッド
        /// </summary>
        private void FileSortName()
        {
            if (_openedFileName != null)
            {
                _fileList = _fileList.OrderBy(x => x).ToArray();
            }
            else
            {
                /**/
            }
        }
Esempio n. 5
0
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            var img     = new ImagingSolution.Imaging.ImageData(""); // 参照画像の取得
            int iw      = img.Width;                                 // 画像の幅を取得
            int ih      = img.Height;                                // 画像の高さを取得
            int allData = 0;                                         // 画像すべての輝度データ
            int p       = 60;                                        // 二値化する割合
            int ag;

            int[] hist = new int[256]; // 輝度を格納するための配列
            for (int i = 0; i < hist.Length; i++)
            {
                hist[i] = 0;                                   // 配列の初期化
            }
            // 元画像の表示
            e.Graphics.DrawImage(img.ToBitmap(), 700, 320, img.Width / 2, img.Height / 2);

            /*画像1ピクセルごとに輝度の値が取得されたときに対応した配列の中身を増やしていく */
            for (int y = 0; y < ih; y++)
            {
                for (int x = 0; x < iw; x++)
                {
                    hist[img[y, x]] += 1;
                }
            }

            // 画素の全データを取得
            for (int k = 0; k < hist.Length; k++)
            {
                allData += hist[k];
            }

            // 二値化する割合に相当する画素
            ag = allData * p / 100;

            // 画素データの初期化
            allData = 0;

            // 閾値の決定
            for (int l = 0; l < hist.Length; l++)
            {
                allData += hist[l];
                if (allData > ag)
                {
                    ag = l;
                    break;
                }
            }

            /* 二値化処理 */
            for (int y2 = 0; y2 < ih; y2++)
            {
                for (int x2 = 0; x2 < iw; x2++)
                {
                    if (img[y2, x2] < ag)
                    {
                        img[y2, x2] = 0;
                    }
                    else if (img[y2, x2] >= ag)
                    {
                        img[y2, x2] = 255;
                    }
                }
            }

            Pen blue  = new Pen(Color.Blue, 1);
            Pen black = new Pen(Color.Black, 1);

            /* histの配列の値を表示(実際の大きさよりも縮小) */
            for (int j = 0; j < hist.Length; j++)
            {
                e.Graphics.DrawLine(blue, 10, 10 + j, (hist[j] / 10) + 10, 10 + j);
            }

            /* 軸 */
            e.Graphics.DrawLine(black, 10, 5, 500, 5);
            e.Graphics.DrawLine(black, 10, 5, 10, 300);

            Bitmap im = img.ToBitmap();

            // 二値化した画像の出力
            e.Graphics.DrawImage(im, 100, 320, img.Width / 2, img.Height / 2);



            ///////////////////////////////////// 4 近傍連結 ////////////////////////////////////

            int[]      b = new int[im.Width * im.Height];
            List <int> lst = new List <int>();
            int        siz = 3;
            int        lbnum = 0;
            int        idx = 0;
            int        x1, y1;
            Color      cl;

            for (int y = 0; y < im.Height; y++)
            {
                for (int x = 0; x < im.Width; x++)
                {
                    // ラベルが貼られていない時
                    if (b[y * im.Width + x] == 0)
                    {
                        cl = im.GetPixel(x, y);

                        // 次のラベルに移行
                        lbnum++;
                        b[y * im.Width + x] = lbnum;

                        // 未調査座標を追加
                        lst.Add(y * im.Width + x);
                        do
                        {
                            idx = 0;
                            x1  = lst[0] % im.Width;
                            y1  = lst[0] / im.Width;

                            for (int i = (y1 - (siz / 2)); i <= (y1 + (siz / 2)); i++)
                            {
                                for (int j = (x1 - (siz / 2)); j <= (x1 + (siz / 2)); j++)
                                {
                                    if ((i >= 0 && i < im.Height) && (j >= 0 && j < im.Width))
                                    {
                                        // 上下左右の時
                                        if (idx % 2 == 1)
                                        {
                                            // すでにラベルが貼られているか
                                            if (b[i * im.Width + j] == 0)
                                            {
                                                // 色が同じ時
                                                if (im.GetPixel(j, i) == cl)
                                                {
                                                    // ラベルを貼る
                                                    b[i * im.Width + j] = lbnum;

                                                    // ラベルを貼った座標を未調査座標に追加する
                                                    lst.Add(i * im.Width + j);
                                                }
                                            }
                                        }
                                    }
                                    idx++;
                                }
                            }
                            lst.RemoveAt(0);
                        } while (lst.Count > 0);
                        lst.Clear();
                    }
                }
            }

            /*
             * // ラベルが貼られている連結成分を数える
             * for (int j = 0; j < im.Height; j++)
             * {
             *  for (int i = 0; i < im.Width; i++)
             *  {
             *      if (b[j * im.Width + i] == 1)
             *      {
             *          counter++;
             *      }
             *  }
             * }
             *
             */
            // Console.WriteLine("Chain:" + counter);
            Console.WriteLine(lbnum);

            // 連結成分の個数をformに表示
            Label lb = new Label();

            lb.Parent = this;
            lb.Text   = "Chain:" + lbnum;
            lb.Left   = 600;
            lb.Top    = 50;
            lb.Width  = 300;
            lb.Height = 200;
            lb.Font   = new Font(lb.Font.FontFamily, 36);
        }