Преобразование изображения «рыбий глаз» в альбомную ориентацию и разделение его на четыре части с помощью c#

#c# #image-processing

#c# #обработка изображений

Вопрос:

У меня есть изображение «рыбий глаз», и то, что я пытаюсь сделать, это преобразовать его в альбомную ориентацию. Написанный мной код преобразует его в альбомную ориентацию, но когда дело доходит до разделения его на разные части, к ним добавляются черные части.

Кто-нибудь может помочь

 using System;
using System.Drawing;

namespace fisheye_image
{
    class Program
    {
        static void Main()
        {
            // assume the source image is square, and its width has even number of pixels
            Bitmap bm = (Bitmap)Image.FromFile(@"C:UsersabcDesktoplillestromfisheye.jpg");

        int l = bm.Width / 2;
        int i, j;
        int x, y;
        double radius, theta;
        // calculated indices in Cartesian coordinates with trailing decimals
        double fTrueX, fTrueY;
        int iSourceWidth = (2 * l);

        int run = 0, lastWidth = 1;


        while (run<4)
        {
            Bitmap bmDestination = new Bitmap(lastWidth*l, l);
            for (i = 0; i < bmDestination.Height;   i)
            {
                radius = (double)(l - i);

                for (j = run*l; j < lastWidth*l ;   j)
                {
                    // theta = 2.0 * Math.PI * (double)(4.0 * l - j) / (double)(4.0 * l);
                    theta = 2.0 * Math.PI * (double)(-j) / (double)(4.0 * l);

                    fTrueX = radius * Math.Cos(theta);
                    fTrueY = radius * Math.Sin(theta);

                    // "normal" mode
                    x = (int)(Math.Round(fTrueX))   l;
                    y = l - (int)(Math.Round(fTrueY));
                    // check bounds
                    if (x >= 0 amp;amp; x < iSourceWidth amp;amp; y >= 0 amp;amp; y < iSourceWidth)
                    {
                        bmDestination.SetPixel(j, i, bm.GetPixel(x, y));
                    }
                }
            }
            bmDestination.Save(@"C:UsersabcDesktopfisheyelandscape" run.ToString() ".jpg",System.Drawing.Imaging.ImageFormat.Jpeg);
            run  ;
            lastWidth  ;
        }
      }
   }
}
  

Ниже приведены исходные и обработанные изображения

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь
введите описание изображения здесь введите описание изображения здесь

Ответ №1:

Нам просто нужно добавить еще одну переменную ‘k’ во втором цикле for, которая изменяется от нуля до ширины целевого изображения.

     while (run<4)
        {
            Bitmap bmDestination = new Bitmap(l, l);

            for (i = 0; i < bmDestination.Height;   i)
            {
                radius = (double)(l - i);

                for (j = run * l, k = 0; j < lastWidth * l||k < bmDestination.Width;   j,   k)
                {
                    // theta = 2.0 * Math.PI * (double)(4.0 * l - j) / (double)(4.0 * l);
                    theta = 2.0 * Math.PI * (double)(-j) / (double)(4.0 * l);

                    fTrueX = radius * Math.Cos(theta);
                    fTrueY = radius * Math.Sin(theta);

                    // "normal" mode
                    x = (int)(Math.Round(fTrueX))   l;
                    y = l - (int)(Math.Round(fTrueY));
                    // check bounds
                    if (x >= 0 amp;amp; x < iSourceWidth amp;amp; y >= 0 amp;amp; y < iSourceWidth)
                    {
                        bmDestination.SetPixel(k, i, bm.GetPixel(x, y));
                    }
                }