Манипулирование изображениями с использованием среднего ядраC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Манипулирование изображениями с использованием среднего ядра

Сообщение Anonymous »

Я работал над кодом, который берет изображение, преобразует его в оттенки серого, а затем выполняет манипуляции с изображением в зависимости от того, какая кнопка нажата. При нажатии кнопки (например, Average 3x3, Prewitt 5x5) она вызывает функцию 2D-умножения, которая циклически обрабатывает изображение в оттенках серого, одновременно проходя по ядру, добавляя все значения в матрице. Если какое-либо значение превышает 255, оно устанавливает его равным 255. Затем используется SetPixel для временной переменной растрового изображения, которая, наконец, помещается в графический блок. Когда я запускаю программу, я выбираю изображение, и оно показывает его (в оттенках серого), но после выбора одного из фильтров программа зависает примерно на 30 секунд, а затем ничего не меняется, фильтр не применяется. Я пробовал отладку, но не могу понять, в чем проблема!

РЕДАКТИРОВАТЬ: первоначальный вопрос решен (мне пришлось обновить графическое поле, чтобы появилось новое изображение правильно.
Но я столкнулся с другой проблемой, связанной с ядром prewitt

я получаю эту ошибку
"Дополнительная информация: Значение '. -6 недопустимо для «красного». Значение «красное» должно быть больше или равно 0 и меньше или равно 255».

А я нет. уверен, что нужно изменить в моем коде, чтобы это исправить.

Инициализация:

public partial class Form1 : Form
{
private Image img;
Bitmap grayscaleimage;
double[][] AVGKernel = new double[11][];
double[][] PrewittKernel = new double[11][];
int[] AVGKernal1DH = new int[11];
int[] AVGKernal1DV = new int[11];

Bitmap tempBitmap;

public Form1()
{
InitializeComponent();
for (int i = 0; i < 11; i++)
{
AVGKernel = new double[11];
PrewittKernel = new double[11];
for (int j = 0; j < 11; j++)
{
AVGKernel[j] = 0;
PrewittKernel[j] = 0;
AVGKernal1DH[j] = 0;
AVGKernal1DV[j] = 0;
}
}
}


Кнопка открытия и перевод изображения в оттенки серого:

private void OpenImageButton(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
this.img = Image.FromFile(openFileDialog.FileName);

grayscaleimage = new Bitmap(img);
int rgb;
Color c;

for (int y = 0; y < grayscaleimage.Height; y++)
for (int x = 0; x < grayscaleimage.Width; x++)
{
c = grayscaleimage.GetPixel(x, y);
rgb = (int)((c.R + c.G + c.B) / 3);
grayscaleimage.SetPixel(x, y, Color.FromArgb(rgb, rgb, rgb));
}
this.pictureBox1.BackgroundImage = grayscaleimage;
pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;
}
}


пример множества доступных кнопок:

private void button5_Click(object sender, EventArgs e)
{
AVGKernel[0][0] = 1; AVGKernel[0][1] = 1; AVGKernel[0][2] = 1; AVGKernel[0][3] = 1; AVGKernel[0][4] = 1;
AVGKernel[1][0] = 1; AVGKernel[1][1] = 1; AVGKernel[1][2] = 1; AVGKernel[1][3] = 1; AVGKernel[1][4] = 1;
AVGKernel[2][0] = 1; AVGKernel[2][1] = 1; AVGKernel[2][2] = 1; AVGKernel[2][3] = 1; AVGKernel[2][4] = 1;
AVGKernel[3][0] = 1; AVGKernel[3][1] = 1; AVGKernel[3][2] = 1; AVGKernel[3][3] = 1; AVGKernel[3][4] = 1;
AVGKernel[4][0] = 1; AVGKernel[4][1] = 1; AVGKernel[4][2] = 1; AVGKernel[4][3] = 1; AVGKernel[4][4] = 1;

kernal2DMultiplication(AVGKernel, 5);
this.pictureBox1.BackgroundImage = tempBitmap;

}


Ядро Prewitt 5x5

private void button13_Click(object sender, EventArgs e)
{
PrewittKernel[0][0] = 2; PrewittKernel[0][1] = 1; PrewittKernel[0][2] = 0; PrewittKernel[0][3] = -1; PrewittKernel[0][4] = -2;
PrewittKernel[1][0] = 2; PrewittKernel[1][1] = 1; PrewittKernel[1][2] = 0; PrewittKernel[1][3] = -1; PrewittKernel[1][4] = -2;
PrewittKernel[2][0] = 2; PrewittKernel[2][1] = 1; PrewittKernel[2][2] = 0; PrewittKernel[2][3] = -1; PrewittKernel[2][4] = -2;
PrewittKernel[3][0] = 2; PrewittKernel[3][1] = 1; PrewittKernel[3][2] = 0; PrewittKernel[3][3] = -1; PrewittKernel[3][4] = -2;
PrewittKernel[4][0] = 2; PrewittKernel[4][1] = 1; PrewittKernel[4][2] = 0; PrewittKernel[4][3] = -1; PrewittKernel[4][4] = -2;

kernal2DMultiplication(PrewittKernel, 5);
this.pictureBox1.BackgroundImage = tempBitmap;
this.pictureBox1.Refresh();
}


и, наконец, вызываемая функция:

private void kernal2DMultiplication(double[][] kernel, int size)
{
tempBitmap = grayscaleimage;
double nrgb = 0;

for (int i = 0; i < grayscaleimage.Width - size / 2; i++)
{
for (int j = 0; j < grayscaleimage.Height - size / 2; j++)
{
if (i >= size / 2 && j >= size / 2)
{
for (int k = 0; k < size; k++)
for (int l = 0; l < size; l++)

nrgb += grayscaleimage.GetPixel(i + k - (size / 2), j + l - (size / 2)).R * kernel[k][l];
nrgb = nrgb / (size * size);

if (nrgb > 255)
nrgb = 255;

tempBitmap.SetPixel(i, j, Color.FromArgb((int)nrgb, (int)nrgb, (int)nrgb));

}

}

}
}


Подробнее здесь: https://stackoverflow.com/questions/267 ... age-kernel
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Использование пандов для расчета среднего декабрьского января-февраля среднего
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Манипулирование изображениями KMM для Android и iOS
    Anonymous » » в форуме Android
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Манипулирование изображениями KMM для Android и iOS
    Anonymous » » в форуме IOS
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Манипулирование списками в C# с использованием Linq
    Anonymous » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Манипулирование байт-кодом Java с использованием asm [закрыто]
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»