Компьютерная обработка изображений Лекция №4 Кафедра П и КО СПбГУ ИТМО 2005 Создание изображений в библиотеке IPL // cоздание заголовочного описания изображения 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 = 65536 / (width + height); // указатель на массив данных unsigned short* p = (unsigned short*) img->imageData; // обход изображения по строкам for( int y=0; y<height; ++y ) { for( int x=0; x<width; ++x ) { // установка значения каждого пиксела p[x] = muler * (x + y); // переход к следующей строке p = p + img->widthStep; } } Создание тестового изображения // создание одноканального изображения 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 void iplZoom(IplImage* srcImage, IplImage* dstImage, int xDst, int xSrc, int yDst, int ySrc, int interpolate); // увеличивает изображение xDst=2 xSrc=1 yDst=2 ySrc=1 Действие функции 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_NN IPL_INTER_LINEAR IPL_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=0 flipAxis=1 flipAxis=-1 Действие функции iplRotate void iplRotate(IplImage* srcImage, IplImage* dstImage, double angle, double xShift, double yShift, int interpolate); // осуществляет поворот изображения angle=45 angle=-45 Действие функции iplRotate void iplRotate(IplImage* srcImage, IplImage* dstImage, double angle, double xShift, double yShift, int interpolate); // осуществляет поворот изображения angle=45 xShift=srcImage->width/2 yShift=srcImage->height/2 Действие макроса iplRotateCenter void iplRotateCenter(IplImage* srcImage, IplImage* dstImage, double angle, double xCenter, double yCenter, int interpolate); // осуществляет поворот изображения angle=45 xCenter=srcImage->width/2 yCenter=srcImage->height/2 Пример программы 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