BMP формат
PPM формат
- "image in top to bottom, left to right order."
Расчет координат
Рис. Области перекрытия при сравнении
Горизонтальное сравнение
- Координаты левого верхнего угла для Tex1 при заданном смещении x и y:
- Tex1PixelX = width - 1 - xmargin + x;
- PPM: Tex1PixelY = (y<yoffset) ? 0 : y - yoffset ;
- BMP: Tex1PixelY = (y<yoffset) ? height - 1 : (height - 1) - (y - yoffset) ;
- Координаты левого верхнего угла для Tex2 при заданном смещении x и y:
- Tex2PixelX = 0;
- PPM: Tex2PixelY = (y<yoffset) ? yoffset - y : 0 ;
- BMP: Tex2PixelY = (y<yoffset) ? (height - 1) - (yoffset - y) : height - 1 ;
- Ширина и высота поля перекрытия:
- xwidth = xmargin - x;
- yheight = (y<yoffset) ? height - yoffset + y : height - (y - yoffset) ;
pixel = xwidth * yheight ;
for (div = 0; div < xwidth ; div++)
{
Tex1CoorXf = (Tex1PixelX + divx) / (float) width;
Tex2CoorXf = (Tex2PixelX + divx) / (float) width;
for (divy = 0; divy < yheight ; divy++)
{
Tex1CoorYf = (Tex1PixelY + divy) / (float) {{Кр|height}};
Tex2CoorYf = (Tex2PixelY + divy) / (float) {{Кр|height}};
Tex1Pixel = tex2D(tex1, Tex1CoorXf, Tex1CoorYf);
Tex2Pixel = tex2D(tex2, Tex2CoorXf, Tex2CoorYf);
ErrorSum += PixelSub(Tex1Pixel, Tex1Pixel);
}
}
ErrorSum = ErrorSum/pixel;
dM[x,y] = ErrorSum;
Вертикальное сравнение
- Координаты левого верхнего угла для Tex1 при заданном смещении x и y:
- Tex1PixelX = (x<xoffset) ? 0 : x - xoffset;
- PPM: Tex1PixelY = (height - 1) - ymargin + y;
- BMP: Tex1PixelY = ymargin - y;
- Координаты левого верхнего угла для Tex2 при заданном смещении x и y:
- Tex2PixelX = (x<xoffset) ? xoffset - x : 0 ;
- PPM: Tex2PixelY = 0;
- BMP: Tex2PixelY = height - 1;
- Ширина и высота поля перекрытия:
- xwidth = (x<xoffset) ? width - xoffset + x : width - (x - xoffset) ;
- yheight = ymargin - y;
Преобразование координат между PPM и BMP
- xPPM = xBMP
- yPPM = height - 1 - yBMP
- xBMP = xPPM
- yBMP = height - 1 - yPPM
Формат для чтения слоя
Текстовый файл в следующем формате:
<Число_строк> <Число_столбцов> <Направление_обхода>
; row = VALUE column= VALUE
; order = VALUE
<Имя_картинки_1>
<Имя_картинки_2>
#; комментарий
<Имя_картинки_3>
. . .
<Имя_картинки_N>
Направление обхода (order) кодируется следующим образом:
- 0 — слева направо, сверху вниз;
- 1 — слева направо, снизу вверх;
- 2 — сверху вниз, слева направо;
- 3 — снизу вверх, слева направо.
Пример файла
; row =3 column=3 order = 0
M1R01C4_.bmp
M1R01C5_.bmp
M1R01C6_.bmp
M1R02C4_.bmp
M1R02C5_.bmp
M1R02C6_.bmp
M1R03C4_.bmp
M1R03C5_.bmp
M1R03C6_.bmp
Сборка картинки
- ΔXV2 = ΔXH1 + ΔXV1 - ΔXH2
- ΔYV2 = ΔYV1 + ΔYH1 - ΔYH2
- ΔXH2 = ΔXH1 + ΔXV1 - ΔXV2
- ΔYH2 = ΔYV2 + ΔYH1 - ΔYV1
Обозначения:
- ΔXH* = XMARGIN
- ΔYV* = YMARGIN
- ΔXV* = XOFFSET
- ΔYH* = YOFFSET
Проверка
|
C4 |
|
C5 |
|
C6
|
R1
|
|
XH00; YH00 |
|
XH01; YH01 |
|
32[60]; 31[-1] |
25[67]; 31[-1]
|
|
XV00; YV00 |
; |
XV01; YV01 |
; |
XV02; YV02
|
42[10]; 29[93] |
43[11]; 29[93] |
44[12]; 29[93]
|
R2
|
|
XH10; YH10 |
|
XH11; YH11 |
|
33[59]; 31[-1] |
27[65]; 32[0]
|
|
XV10; YV10 |
; |
XV11; YV11 |
; |
XV12; YV12
|
23[-9]; 39[83] |
22[-10]; 39[83] |
22[-10]; 39[83]
|
R3
|
|
XH20; YH20 |
|
XH21; YH21 |
|
33[59]; 30[-2] |
26[66]; 32[0]
|
Проверка четвёрок:
- R1C4/R1C5/R2C4/R2C5:
- ΔXV01 = ΔXH00 + ΔXV00 - ΔXH10 = 60 + 10 - 59 = 11
- ΔYV01 = ΔYV00 + ΔYH00 - ΔYH10 = 93 + (-1) - (-1) = 93
- R2C4/R2C5/R3C4/R3C5:
- ΔXV11 = ΔXH10 + ΔXV10 - ΔXH20 = 59 + (-9) - 59 = -9 (-10)
- ΔYV11 = ΔYV10 + ΔYH10 - ΔYH20 = 83 + (-1) - (-2) = 84 (83)
- R1C5/R1C6/R2C5/R2C6:
- ΔXV01 = 67 + 11 - 65 = 13 (12)
- ΔYV01 = 93 + (-1) - 0 = 92 (93)
- R2C5/R2C6/R3C5/R3C6:
- ΔXV01 = 65 + (-10) - 66 = -11 (-10)
- ΔYV01 = 83 + 0 - 0 = 83
Совмещение картинок
Сборка общего изображения
Расчёт координат левого верхнего угла для каждой текстуры
YTex[0][0] = 0;
XTex[0][0] = 0;
for(j = 1; j < cols; j++){
YTex[0][j] = YTex[0][j-1] + Yh[0][j-1];
XTex[0][j] = XTex[0][j-1] + width - Xh[0][j-1];
}
for(int i = 1; i < rows; i++){
XTex[i][0] = XTex[i-1][0] + Xv[i-1][0];
YTex[i][0] = YTex[i-1][0] + height - Yv[i-1][0];
for(j = 1; j < cols; j++){
XTex[i][j] = XTex[i][j-1] + width - Xh[i][j-1];
YTex[i][j] = YTex[i-1][j] + height - Yv[i-1][j];
}
}
Расчёт высоты и ширины общего изображения
- widthA = XTex[0][cols-1] + width;
- heightA = YTex[rows-1][0] + height;
Расчёт координат с учётом положения в общей текстуре
- XC = (XTex + x)/widthA;
- YC = (YTex + y)/heightA;
- xf = x/width;
- yf = y/height;
Расчёт градиента для областей перекрытия
- t0 = t1 = 1.0f;
- if(x < Xh)
- if(y < Yv){
- }
- if((x>=Xh) & (y>=Yv))t1=1.0f;
- t0=1.0f-t1;
Сохранение текущего изображения в итоговую текстуру
- PixelC[XC][YC] = PixelC[XC][YC]*t0 + PixelC[xf][yf]*t1;
Пример запуска программы из командной строки
./compareBMP ../../data/impinj/m1/m1_3x3.dat --xmargin 60 --ymargin 90 --offset 32
./compareBMP ../../data/impinj/m1/m1_3x4.dat --xmargin 60 --ymargin 90 --offset 32
Вывод на последнюю команду
fset 32
xmarg = 60, ymarg = 90, offset = 32, path = ../../data/impinj/m1/m1_3x4.dat
cols = 4, rows = 3, mode = 0
XH00 = 60 YH00 = -1
XV00 = 10 YV00 = 93
XH01 = 67 YH01 = -1
XV01 = 11 YV01 = 93
XH02 = 61 YH02 = -1
XV02 = 12 YV02 = 93
XV03 = -1 YV03 = 92
XH10 = 59 YH10 = -1
XV10 = -9 YV10 = 83
XH11 = 65 YH11 = 0
XV11 = -10 YV11 = 83
XH12 = 72 YH12 = -1
XV12 = -10 YV12 = 83
XV13 = 1 YV13 = 84
XH20 = 59 YH20 = -2
XH21 = 66 YH21 = 0
XH22 = 61 YH22 = -1
NEW