прореживание изображения персонажа - PullRequest
4 голосов
/ 23 августа 2011

я делаю приложение ocr.Я сбиваю с толку то, как сделать перекос изображения как это:

enter image description here

Во-вторых, у меня есть изображение персонажа с большим размером шрифта.проблема в том, как их утончить до такого размера, как этот

http://upload.wikimedia.org/wikipedia/commons/9/93/Skel.png

Ответы [ 2 ]

3 голосов
/ 23 августа 2011

Для вашей первой точки: найдите угол, на который поворачивается текст, и поверните изображение на этот угол. В вашем примере вы можете сделать это, найдя углы линий между большими черными пятнами по краям и белыми областями. Посмотрите на обнаружение кромок и грубое преобразование , чтобы помочь вам найти линии, а затем помочь вам найти их угол. OpenCV имеет хорошую реализацию обоих алгоритмов.

Для вашего второго пункта: это морфологическая операция бинарный скелет в действии.

0 голосов
/ 24 января 2015

Вы можете использовать следующий код для обнаружения и исправления перекоса, но мне нужна ваша помощь, если вы получите какие-либо алгоритмы прореживания ... предположим, что входное изображение находится в графическом окне ....

        try
        {
            //Check if there exists an image on the picture box
            if (pictureBox1.Image == null)
            {
                MessageBox.Show("Please load an image first.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                uploadImageToolStripMenuItem.PerformClick();
                return;
            }                
            Bitmap image = new Bitmap(pictureBox1.Image);
            BitmapData imageData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height),
                                    ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);
            //document image skew detection starts here
            DocumentSkewChecker skewChecker = new DocumentSkewChecker();
            // get documents skew angle
            double angle = skewChecker.GetSkewAngle(imageData);
            // create rotation filter and rotate image applying the filter
            RotateBilinear rotationFilter = new RotateBilinear(-angle);
            rotationFilter.FillColor = Color.White;
            image.UnlockBits(imageData);
            //if the angle is more 90 or 180, consider it as a normal image or if it is not, perform a skew correction
            if (-angle == 90 || -angle == 180)
            {
                pictureBox1.Image = image;
                pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
                return;
            }

            //Bitmap rotatedImage = rotationFilter.Apply();
            //draw a bitmap based on the skew angle...
            Bitmap returnBitmap = new Bitmap(image.Width, image.Height);
            Graphics g = Graphics.FromImage(returnBitmap);
            g.TranslateTransform((float)image.Width / 2, (float)image.Height / 2);
            g.RotateTransform(((float)angle));
            g.TranslateTransform(-(float)image.Width / 2, -(float)image.Height / 2);
            g.DrawImage(image, new Point(0, 0));

            pictureBox1.Image = returnBitmap;
            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);

        }
...