Компьютерная обработка изображений Лекция 4 Кафедра П и КО СПбГУ ИТМО 2005
Создание изображений в библиотеке IPL // создание заголовочного описания изображения IplImage* img = iplCreateImageHeader( 1, // одноканальное изображение 0, // нет alpha-канала IPL_DEPTH_16U, // данные типа unsigned short "GRAY", // цветовая модель "GRAY", // последовательность каналов IPL_DATA_ORDER_PIXEL, // способ выравнивания данных IPL_ORIGIN_TL, // начало координат в верхнем левом углу IPL_ALIGN_DWORD, // 4-байтовое выравнивание данных width, height, // ширина и высота изображения NULL, NULL, // не используется ROI, нет маски ROI NULL, NULL); // ID не используется, нет разбиения // размещение изображения без заполнения значениями iplAllocateImage( img, // изображение 0, // флаг заполнения значениями 0 ); // значение для заполнения … // освобождение памяти выделенной для изображения iplDeallocate( img, // изображение IPL_IMAGE_ALL ); // вся информация об изображении
Создание изображения в программе // коэффициент уровня интенсивности int const factor = / (width + height); // указатель на массив данных unsigned short* p = (unsigned short*) img->imageData; // обход изображения по строкам for( int y=0; y
Создание тестового изображения // создание одноканального изображения Jaehne IplImage* img = iplCreateImageJaehne( IPL_DEPTH_8U, 200, 150 );... // освобождение памяти выделенной для изображения iplDeallocate( img, IPL_IMAGE_ALL );
Создание изображения из формата BMP // чтение формата BMP BITMAPINFOHEADER* bmphdr;... // создание заголовочного описания изображения IplImage* img = iplCreateImageHeader(3, 0, IPL_DEPTH_8U, "RGB", "BGR", IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_BL, IPL_ALIGN_DWORD, bmphdr->biWidth, bmphdr->biHeight, NULL, NULL, NULL, NULL); // преобразование DIB в изображение IPL iplConvertFromDIB( bmphdr, img );... // освобождение памяти выделенной для изображения iplDeallocate( img, IPL_IMAGE_ALL );
Функции для геометрических преобразований iplZoom - растягивает или увеличивает изображение iplDecimate - сжимает или уменьшает изображение iplResize - изменяет размеры изображения iplDecimateBlur - уменьшает и размывает изображение
Действие функции iplZoom xDst=2 xSrc=1 yDst=2 ySrc=1 void iplZoom(IplImage* srcImage, IplImage* dstImage, int xDst, int xSrc, int yDst, int ySrc, int interpolate); // увеличивает изображение
Действие функции iplDecimate void iplDecimate(IplImage* srcImage, IplImage* dstImage, int xDst, int xSrc, int yDst, int ySrc, int interpolate); // уменьшает изображение xDst=1 xSrc=2 yDst=1 ySrc=2
Действие функции iplResize void iplResize(IplImage* srcImage, IplImage* dstImage, int xDst, int xSrc, int yDst, int ySrc, int interpolate); // изменяет размеры изображения xDst=3 xSrc=2 yDst=2 ySrc=3
Выбор режима интерполяции IPL_INTER_NNIPL_INTER_LINEARIPL_INTER_CUBIC
Действие функции iplDecimateBlur void iplDecimateBlur(IplImage* srcImage, IplImage* dstImage, int xDst, int xSrc, int yDst, int ySrc, int interpolate); // уменьшает изображение с размытием iplDecimate iplDecimateBlur
Макросы для геометрических преобразований iplZoomFit(srcImage, dstImage, interpolate) - растягивает или увеличивает изображение iplDecimateFit(srcImage, dstImage, interpolate) - сжимает или уменьшает изображение iplResizeFit(srcImage, dstImage, interpolate) - изменяет размеры изображения
Функции для геометрических преобразований void ipl...(IplImage* srcImage, // исходное изображение IplImage* dstImage, // итоговое изображение int xDst, int xSrc, // масштаб по х итогового и исходного int yDst, int ySrc, // масштаб по y итогового и исходного int interpolate); // режим интерполирования
Порядок действий 1. Создать временное изображение требуемого размера. 2. Выполнить преобразование исходного изображения и записать результат во временное изображение. 3. Удалить исходное изображение. 4. Скопировать временное изображение на место исходного. 5. Удалить временное изображение.
Пример программы void ZoomImage(IplImage* img, double scale) { // Создать временное изображения с измененным размером IplImage* tmp = iplCreateImageHeader(3, 0, IPL_DEPTH_8U, "RGB", "BGR", IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_BL, IPL_ALIGN_DWORD, img->width*scale, img->height*scale, NULL, NULL, NULL, NULL); // Занять память под временное изображение iplAllocateImage(tmp, 0, 0); if(scale > 1.) // Выполнить увеличение изображения iplZoomFit(img, tmp, IPL_INTER_LINEAR); else // Выполнить уменьшение изображения iplDecimateFit(img, tmp, IPL_INTER_LINEAR); // Освободить память исходного изображения iplDeallocate(img, IPL_IMAGE_ALL); // Скопировать результат в исходное изображение img=iplCloneImage(tmp); // Освободить память временного изображения iplDeallocate(tmp, IPL_IMAGE_ALL); }
Действие функции iplMirror void iplMirror(IplImage* srcImage, IplImage* dstImage, int flipAxis); // осуществляет зеркальные отображения flipAxis=0flipAxis=1flipAxis=-1
Действие функции iplRotate void iplRotate(IplImage* srcImage, IplImage* dstImage, double angle, double xShift, double yShift, int interpolate); // осуществляет поворот изображения angle=45 angle=-45
Действие функции iplRotate angle=45 xShift=srcImage->width/2 y Shift=srcImage->height/2 void iplRotate(IplImage* srcImage, IplImage* dstImage, double angle, double xShift, double yShift, int interpolate); // осуществляет поворот изображения
Действие макроса iplRotateCenter angle=45 xCenter=srcImage->width/2 yCenter=srcImage->height/2 void iplRotateCenter(IplImage* srcImage, IplImage* dstImage, double angle, double xCenter, double yCenter, int interpolate); // осуществляет поворот изображения
Пример программы void RotateImageCW(IplImage* img) { // Создать временное изображение с измененным размером IplImage* tmp = iplCreateImageHeader(3, 0, IPL_DEPTH_8U, "RGB", "BGR", IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_BL, IPL_ALIGN_DWORD, img->height, img->width, NULL, NULL, NULL, NULL); // Занять память под временное изображение iplAllocateImage(tmp, 0, 0); // Выполнить поворот с последующим сдвигом iplRotate(img, tmp, 90, 0, img->width-1, IPL_INTER_LINEAR); // Освободить память исходного изображения iplDeallocate(img, IPL_IMAGE_ALL ); // Скопировать результат в исходное изображение img=iplCloneImage(tmp); // Освободить память временного изображения iplDeallocate( tmp, IPL_IMAGE_ALL ); }
Действие программы iplRotateCW