51098

Увеличение и уменьшение цифровых изображений

Лабораторная работа

Информатика, кибернетика и программирование

Цель работы: написать программу способную производить увеличение/уменьшение исходного изображения в нецелое число раз методом билинейной интерполяции. Код программы...

Русский

2014-02-05

208.4 KB

5 чел.

Министерство Образования Республики Беларусь

Учреждение образования

«Брестский государственный технический университет»

Кафедра ЭВМ и С

Лабораторная работа №2

«Увеличение и уменьшение цифровых изображений»

Выполнил:

студент 4-го курса

гр. Э-41, ФЭИС

Якубчик А.Н.

Проверил:

Кузьмицкий Н.Н.

Брест 2013

Цель работы:

- написать программу способную производить увеличение/уменьшение исходного изображения в нецелое число раз методом билинейной интерполяции.

Код программы:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace mashtabirovanie

{

   public partial class Form1 : Form

   {

       public Form1()

       {

           this.InitializeComponent();

           this.AutoScroll = true;

         

       }

          

       public byte[] ar;

       

       

       private void Zoom(double d, int chek)

       {

           this.AutoScroll = true;

           openFIleToolStripMenuItem.Enabled = false;

           zoomToolStripMenuItem.Enabled = false;

           Bitmap ZoomImg = new Bitmap((int)(pictureBox1.Image.Width * d),

               (int)(pictureBox1.Image.Height * d)); //полученный битмап

          

           Bitmap tmp = new Bitmap(pictureBox1.Image);

           if (chek==0)

           {

               progressBar1.Value = 0;

               progressBar1.Maximum = ZoomImg.Height + 1;

               for (int i = 0; i < ZoomImg.Height; i++)

               {

                   for (int j = 0; j < ZoomImg.Width; j++)

                   {

                       ZoomImg.SetPixel(j, i, tmp.GetPixel((int)(j / d), (int)(i / d)));

                   }

                   progressBar1.Value++;

                  // Application.DoEvents();

               }

           }

           else

           {

               double nX = (double)tmp.Width / (double)ZoomImg.Width;

               double nY = (double)tmp.Height / (double)ZoomImg.Height;

               double fraction_x, fraction_y, one_minus_x, one_minus_y;

               int ceil_x, ceil_y, floor_x, floor_y;

               Color c1 = new Color();

               Color c2 = new Color();

               Color c3 = new Color();

               Color c4 = new Color();

               byte red, green, blue;

               byte b1, b2;

               progressBar1.Value = 0;

               progressBar1.Maximum = ZoomImg.Width + 1;

               for (int x = 0; x < ZoomImg.Width; ++x)

               {

                   for (int y = 0; y < ZoomImg.Height; ++y)

                   {

                      

                       floor_x = (int)Math.Floor(x * nX); //получаем число меньшее или равное задоному

                       floor_y = (int)Math.Floor(y * nY);

                       ceil_x = floor_x + 1;

                       if (ceil_x >= tmp.Width) ceil_x = floor_x;

                       ceil_y = floor_y + 1;

                       if (ceil_y >= tmp.Height) ceil_y = floor_y;

                       fraction_x = x * nX - floor_x;

                       fraction_y = y * nY - floor_y;

                       one_minus_x = 1.0 - fraction_x;

                       one_minus_y = 1.0 - fraction_y;

                       c1 = tmp.GetPixel(floor_x, floor_y);

                       c2 = tmp.GetPixel(ceil_x, floor_y);

                       c3 = tmp.GetPixel(floor_x, ceil_y);

                       c4 = tmp.GetPixel(ceil_x, ceil_y);

                       // Blue

                       b1 = (byte)(one_minus_x * c1.B + fraction_x * c2.B);

                       b2 = (byte)(one_minus_x * c3.B + fraction_x * c4.B);

                       blue = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

                       // Green

                       b1 = (byte)(one_minus_x * c1.G + fraction_x * c2.G);

                       b2 = (byte)(one_minus_x * c3.G + fraction_x * c4.G);

                       green = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

                       // Red

                       b1 = (byte)(one_minus_x * c1.R + fraction_x * c2.R);

                       b2 = (byte)(one_minus_x * c3.R + fraction_x * c4.R);

                       red = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

                       ZoomImg.SetPixel(x, y, System.Drawing.Color.FromArgb(255, red, green, blue));

                   }

                   progressBar1.Value++;

                   Application.DoEvents();

               }

           }

           pictureBox2.Width = ZoomImg.Width;

           pictureBox2.Height = ZoomImg.Height;

           pictureBox2.Image = ZoomImg;

           openFIleToolStripMenuItem.Enabled = true;

       }

      

       private void Form1_Load(object sender, EventArgs e)

       {

       }

       private void openFIleToolStripMenuItem_Click(object sender, EventArgs e)

       {

           OpenFileDialog open_dialog = new OpenFileDialog();

           if (open_dialog.ShowDialog() == DialogResult.OK)

           {

               Bitmap tek_bmp = (Bitmap)Image.FromFile(open_dialog.FileName);

               pictureBox1.Width = tek_bmp.Width;

               pictureBox1.Height = tek_bmp.Height;

               pictureBox1.Image = tek_bmp;

           }

           zoomToolStripMenuItem.Enabled = true;

       }

       private void zoomToolStripMenuItem_Click(object sender, EventArgs e)

       {

           Form_Zoom f = new Form_Zoom();

           if (f.ShowDialog() == DialogResult.OK)

               Zoom(Convert.ToSingle(f.info), f.biling);

       }

       private void statusStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

       {

       }

       private void toolStripProgressBar1_Click(object sender, EventArgs e)

       {

       }

   }

}

Пример тестирования:

Вывод: освоил приемы обработки графических изображений в формате BMP.


 

А также другие работы, которые могут Вас заинтересовать

40793. Взаимная индуктивность. Идеальный трансформатор 76.91 KB
  Идеальный трансформатор Электрические цепи могут содержать элементы индуктивно связанные друг с другом. Такие элементы могут связывать цепи электрически гальванически разделенные друг от друга. В том случае когда изменение тока в одном из элементов цепи приводит к появлению ЭДС в другом элементе цепи говорят что эти два элемента индуктивно связаны а возникающую ЭДС называют ЭДС взаимной индукции. Степень индуктивной связи элементов характеризуется коэффициентом связи 1 где М – взаимная индуктивность элементов цепи размерность –...
40794. Методы определения коэффициента облученности 1.08 MB
  Методы определения коэффициента облученности При расчете потоков результирующего излучения необходимо располагать данными о коэффициентах облученности. Используя свойства замыкаемости потоков излучения 1471 можно записать . Вычитая из 14122 почленно 1411914121 найдем соотношение для определения взаимных поверхностей излучения 14123 14124 14125 Анализируя 1412314125 сформулируем такое правило: В замкнутой системе состоящей из трех невогнутых тел средняя взаимная...
40795. Явление резонанса. Частотные характеристики 65.71 KB
  Частотные характеристики Резонансом называется такой режим работы цепи включающей в себя индуктивные и емкостные элементы при котором ее входное сопротивление входная проводимость вещественно. Следствием этого является совпадение по фазе тока на входе цепи с входным напряжением. Резонанс в цепи с последовательно соединенными элементамирезонанс напряжений Для цепи на рис. В цепи преобладает индуктивность т.
40796. Характеристическое сопротивление и коэффициент распространения симметричного четырехполюсника 96.65 KB
  Для записи уравнений четырехполюсника выделим в произвольной схеме ветвь с единственным источником энергии и любую другую ветвь с некоторым сопротивлением см. Учитывая что в соответствии с принципом взаимности видно что коэффициенты четырехполюсника связаны между собой соотношением Уравнения 3 и 4 представляют собой основные уравнения четырехполюсника;...
40797. Электрические фильтры 65.69 KB
  Качество фильтра считается тем выше чем ярче выражены его фильтрующие свойства т. Классификация фильтров Название фильтра Диапазон пропускаемых частот Низкочастотный фильтр фильтр нижних частот Высокочастотный фильтр фильтр верхних частот Полосовой фильтр полоснопропускающий фильтр Режекторный фильтр полоснозадерживающий фильтр и где В соответствии с материалом изложенным в предыдущей лекции если фильтр имеет нагрузку сопротивление которой при всех частотах равно характеристическому то напряжения и соответственно токи на...
40798. Линейные электрические цепи при несинусоидальных периодических токах 64.74 KB
  Линейные электрические цепи при несинусоидальных периодических токах. Причины возникновения несинусоидальных напряжений и токов могут быть обусловлены или несинусоидальностью источника питания или и наличием в цепи хотя бы одного нелинейного элемента. Кроме того в основе появления несинусоидальных токов могут лежать элементы с периодически изменяющимися параметрами. Характеристики несинусоидальных величин Для характеристики несинусоидальных периодических переменных служат следующие величины и коэффициенты приведены на примере...
40799. Переходные процессы в линейных электрических цепях с сосредоточенными параметрами 66.4 KB
  Для цепей с заданными постоянными или периодическими напряжениями токами источников принужденная составляющая определяется путем расчета стационарного режима работы схемы после коммутации любым из рассмотренных ранее методов расчета линейных электрических цепей. общее решение уравнения 2 имеет вид 4 Соотношение 4 показывает что при классическом методе расчета послекоммутационный процесс рассматривается как наложение друг на друга двух режимов – принужденного наступающего как бы сразу после коммутации и свободного имеющего...
40800. Способы составления характеристического уравнения 81.02 KB
  Характеристическое уравнение составляется для цепи после коммутации. путем исключения из системы уравнений описывающих электромагнитное состояние цепи на основании первого и второго законов Кирхгофа всех неизвестных величин кроме одной относительно которой и записывается уравнение 2; путем использования выражения для входного сопротивления цепи на синусоидальном токе; на основе выражения главного определителя. Согласно первому способу в предыдущей лекции было получено дифференциальное уравнение относительно напряжения на...
40801. Переходные процессы в цепи с одним накопителем энергии и произвольным числом резисторов 81.22 KB
  Переходные процессы в цепи с одним накопителем энергии и произвольным числом резисторов. Общий подход к расчету переходных процессов в таких цепях основан на применении теоремы об активном двухполюснике: ветвь содержащую накопитель выделяют из цепи а оставшуюся часть схемы рассматривают как активный двухполюсник А эквивалентный генератор см. Совершенно очевидно что постоянная времени здесь для цепей с индуктивным элементом определяется как: и с емкостным как: где входное сопротивление цепи по отношению к зажимам 12 подключения...