Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСИ / АСУ_Меркулова_Обработкаизобр_ Методичка к курсовому.docx
Скачиваний:
37
Добавлен:
03.03.2016
Размер:
216.12 Кб
Скачать

Изменение цветности (бинаризация, оттенки серого, негатив).

Под изменением цветности здесь понимается изменение спектра цветов, используемых в изображении. Минимальное, что нужно сделать в курсовой работе – бинаризация, оттенки серого и негатив, поэтому о них и поговорим.

Бинаризация – это преобразование изображения, в общем случае, к одноцветному (чаще всего к черно-белому). В терминах Photoshop это ещё называется «по уровню 50%», так как при этом выбирается некий порог (например, посередине), все значения ниже которого превращаются в цвет фона, а выше – в основной цвет. Само преобразование можно осуществлять по каналам, но в этом случае результирующее изображение не будет в прямом смысле бинарным (чёрно-белым), а будет содержать 8 чистых цветов, представляющих собой комбинации чистых красного, зелёного и голубого цветов, то есть будет бинарным по каналам. Поэтому лучше проводить преобразование над «полным» цветом точки.

Бинаризация будет выглядеть примерно так:

object Binary(Bitmap bmp)

{

DetectObject = new bool[bmp.Width, bmp.Height];

Bitmap rezultImage = new Bitmap(bmp);

int value;

double Bright;

value = 150; //Для примера выбираем порог, равный 150 (уровень яркости, по которому будет производиться бинарное преобразование)

int i, j;

for (i = 0; i < rezultImage.Width; i++)

{

for (j = 0; j < rezultImage.Height; j++)

{

//Получаем уровень яркости для преобразуемого пикселя

Bright = 0.3 * rezultImage.GetPixel(i, j).R + 0.59 * rezultImage.GetPixel(i, j).G + 0.11 * rezultImage.GetPixel(i, j).B;

if ((int)Bright > value)

{

//Если яркость пикселя больше порогового значения

//Заполняем его белым цветом и сохраняем значение логической матрицы

rezultImage.SetPixel(i, j, Color.White);

DetectObject[i, j] = false;

}

else

{

//Если яркость пикселя меньше порогового значения

//Заполняем его черным цветом и сохраняем значение логической матрицы

rezultImage.SetPixel(i, j, Color.Black);

DetectObject[i, j] = true;

}

}

}

return rezultImage;

}

В обычном случае логическая матрица при бинаризации не используется и ее объявление и заполнение можно опустить. Эта матрица широко используется при выделении границ методом жука.

Преобразование к оттенкам серого заключается в получении яркости каждой точки по известной формуле (Y=0.3*R+0.59*G+0.11*B) и последующем копировании полученного значения по все три канала (R=G=B=Y).

Это будет выглядеть так:

object GrayScale(Bitmap bmp)

{

Bitmap rezultImage = new Bitmap(bmp);

int i, j;

int Gray;

for (i = 0; i < bmp.Width; i++)

{

for (j = 0; j < bmp.Height; j++)

{

Gray = (int)(0.3 * bmp.GetPixel(i, j).R + 0.59 * bmp.GetPixel(i, j).G + 0.11 * bmp.GetPixel(i, j).B);

rezultImage.SetPixel(i, j, Color.FromArgb(Gray, Gray, Gray));

}

}

return rezultImage;

}

И, наконец, негатив получается простой заменой значения каждого канала на его дополнение до 255 (например, R=255-R).