Лекция №4 Компьютерная обработка изображений Кафедра П и КО СПбГУ ИТМО

advertisement
Компьютерная обработка изображений
Лекция №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
Download