Лабораторная работа по информатике 333. Лаба 15. Отчет по лабораторной работе 15 элементы линейной фильтрации изображений
Скачать 181.22 Kb.
|
МИНОБРНАУКИ РОССИИ Санкт-Петербургский государственный электротехнический университет «ЛЭТИ» им. В.И. Ульянова (Ленина) Кафедра ФРТ отчет по лабораторной работе № 15 «ЭЛЕМЕНТЫ ЛИНЕЙНОЙ ФИЛЬТРАЦИИ ИЗОБРАЖЕНИЙ».
Санкт-Петербург 2022 Цель работы. выполнение линейной пространственной фильтрации изображений средствами C++ в среде Visual Studio. Краткие теоретические сведения. Линейная фильтрация в пространственной области заключается в проходе по изображению скользящим окном определенного размера, причем на каждой итерации (при каждом положении окна) вычисляется линейная комбинация значений яркости пикселов, попадающих в это окно, с коэффициентами матрицы весов фильтра, называемой также маской или ядром линейного фильтра. Размер маски равен размеру окна. Свертка изображения - Im с маской Mask. Простейшим видом линейной фильтрации в пространственной области является фильтр скользящего среднего. Результатом такой операции является среднее значение, вычисленное по всем пикселам окна. Математически это эквивалентно свертке с маской, все элементы которой равны 1/n, где n - число элементов маски. Результатом скользящего среднего является «размытие» исходного изображения. Фильтр Гаусса применяют для сглаживания изображения, что эквивалентно фильтрации нижних частот и подавлению высоких частот. В результате изображение размывается, теряется четкость контуров, но также уменьшается шум. Сила размытия изображения зависит от размера маски фильтра. Не полный код private: System::Void button1_Click_1(System::Object^ sender, System::EventArgs^ e) { if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) { img1 = gcnew Bitmap(openFileDialog1->FileName); pictureBox1->Image = Image::FromFile(openFileDialog1->FileName); } } private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) { } private: System::Void button2_Click_1(System::Object^ sender, System::EventArgs^ e) { array for (int i = 0; i < img1->Width - 3; i++) { for (int j = 0; j < img1->Height - 3; j++) { int sum_r = 0, sum_g = 0, sum_b = 0; for (int ii = 0; ii < 3; ii++) { for (int jj = 0; jj < 3; jj++) { cl_ar[ii, jj] = img1->GetPixel(i + ii, j + jj); sum_r += cl_ar[ii, jj].R; sum_g += cl_ar[ii, jj].G; sum_b += cl_ar[ii, jj].B; } } textBox1->Text += "(" + sum_r.ToString() + "," + sum_g.ToString() + "," + sum_b.ToString() + ")" + " \r\n"; } } } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { if (openFileDialog2->ShowDialog() == System::Windows::Forms::DialogResult::OK) { img2 = gcnew Bitmap(openFileDialog2->FileName); pictureBox2->Image = Image::FromFile(openFileDialog2->FileName); } } private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) { array Bitmap^ img = img2; for (int i = 1; i < img2->Width - 2; i++) { for (int j = 1; j < img2->Height - 2; j++) { int sum_r = 0, sum_g = 0, sum_b = 0; for (int ii = -1; ii < 2; ii++) { for (int jj = -1; jj < 2; jj++) { cl_ar[ii + 1, jj + 1] = img2->GetPixel(i + ii, j + jj); sum_r += cl_ar[ii + 1, jj + 1].R; sum_g += cl_ar[ii + 1, jj + 1].G; sum_b += cl_ar[ii + 1, jj + 1].B; } } img->SetPixel(i, j, Color::FromArgb(sum_r / 9, sum_g / 9, sum_b / 9)); } } pictureBox3->Image = img; } private: System::Void button5_Click(System::Object^ sender, System::EventArgs^ e) { if (openFileDialog3->ShowDialog() == System::Windows::Forms::DialogResult::OK) { img3 = gcnew Bitmap(openFileDialog3->FileName); pictureBox4->Image = Image::FromFile(openFileDialog3->FileName); } } private: System::Void button6_Click(System::Object^ sender, System::EventArgs^ e) { array Bitmap^ img = img3; int mas[3][3] = { {1, 2, 1}, {2, 4, 2}, {1, 2, 1} }; for (int i = 1; i < img3->Width - 2; i++) { for (int j = 1; j < img3->Height - 2; j++) { int sum_r = 0, sum_g = 0, sum_b = 0; for (int ii = -1; ii < 2; ii++) { for (int jj = -1; jj < 2; jj++) { cl_ar[ii + 1, jj + 1] = img3->GetPixel(i + ii, j + jj); sum_r += cl_ar[ii + 1, jj + 1].R * mas[ii + 1][jj + 1]; sum_g += cl_ar[ii + 1, jj + 1].G * mas[ii + 1][jj + 1]; sum_b += cl_ar[ii + 1, jj + 1].B * mas[ii + 1][jj + 1]; } } img->SetPixel(i, j, Color::FromArgb(sum_r / 16, sum_g / 16, sum_b / 16)); } } pictureBox5->Image = img; } }; Проверка Вывод. Выполнена линейная пространственная фильтрация изображений средствами C++ в среде Visual Studio. |