ALMACENAMIENTO DE OBJETOS PRACTICO 4 – Ejercicio 1 b) Regla de los segmentos IMAGEN ORIGINAL ARCHIVO: SEGMENTOS_EN_LINEA 257 258 71 13 27 71 14 27 71 15 27 71 16 27 71 17 27 71 18 27 71 19 27 71 20 27 71 21 27 71 22 27 71 23 27 71 24 27 71 25 27 71 26 27 71 27 27 71 28 27 71 29 27 71 30 27 71 31 27 109 31 26 33 32 23 71 32 27 ALMACENAMIENTO DE OBJETOS public class UtilSegmentos { int[,] matriz_visitados; ImagenBinaria I; public ArrayList obtener_segmentos() { ArrayList lista=new ArrayList();int i; for(int j=0; j<I.height; j++) {i=0; while(i<I.width) {if(I.getPixel(i,j)==0) i++; else {int count=0; segmento s = new segmento(); s.set_pto(new Point(i,j)); i++; while(I.getPixel(i,j)!=0 && i<I.width) {i++; count++; } s.set_count(count); lista.Add(s); }} } return lista; }}} Rotación, Traslación, Zoom Práctico 4, Ejercicio 3 a) X’ = X + DX Y’ = Y + DY Rotación, Traslación, Zoom Práctico 4, Ejercicio 3 b) NX = X.cos(ang) + Y.sen(ang) NY= -X.sen(ang) + Y.cos(ang) Rotación, Traslación, Zoom Rotación, Traslación, Zoom public static Bitmap AplicarZoom(Bitmap B, int f) { int lx = B.Width; int ly = B.Height; int ni, nj; int nueva_lx = (int) (lx*(f/100f)); int nueva_ly = (int) (ly*(f/100f)); Bitmap x = new Bitmap(nueva_lx,nueva_ly); for(int i=0; i < lx; i++) for(int j=0; j < ly; j++) { ni=(nueva_lx*i)/lx; nj=(nueva_ly*j)/ly; x.SetPixel(ni,nj,B.GetPixel(i,j)); } return x; } Transformaciones elásticas xDestA = C1 + C2* xA + C3*yA + C4*xA*yA. yDestA = C5 + C6* xA + C7*yA + C8*xA*yA. Transformaciones elásticas Aplicaciones Simulación de proyecciones Reconocimiento de cromosomas por comparación con ideogramas. (múltiples regiones) Erosión Práctico 5. Ejercicio 3 a) void TForm::erosion() { int i,j,k,l; Byte max; Byte *Po,*Pd; Graphics::TBitmap *F=new Graphics::TBitmap(); F->Height=Bitmap->Height; F->Width=Bitmap->Width; F->Assign(Bitmap); for(j=1;j<F->Height-1;j++) { Pd=(Byte*)Bitmap->ScanLine[j]; for(i=1;i<F->Width-1;i++) { max=0; for(l=-1;l<2;l++) { Po=(Byte*)F->ScanLine[j+l]; for(k=-1;k<2;k++) if(Po[i+k]>max)max=Po[i+k]; } Pd[i]=max; } } delete F; Image1->Canvas->Draw(0,0,Bitmap); } Dilatación Práctico 5. Ejercicio 3 b) void TForm::dilatacion() { int i,j,k,l; Byte min; Byte *Po,*Pd; Graphics::TBitmap *F=new Graphics::TBitmap(); F->Height=Bitmap->Height; F->Width=Bitmap->Width; F->Assign(Bitmap); for(j=1;j<F->Height-1;j++) { Pd=(Byte*)Bitmap->ScanLine[j]; for(i=1;i<F->Width-1;i++) { min=255; for(l=-1;l<2;l++) { Po=(Byte*)F->ScanLine[j+l]; for(k=-1;k<2;k++) if(Po[i+k]<min)min=Po[i+k]; } Pd[i]=min; } } Image1->Canvas->Draw(0,0,Bitmap); delete F; } Opening y Closing Erosión condicional: Erosión con la condición que no corte al objeto en dos. Dilatación condicional: Dilatación con la condición de que no una al objeto con otro. Opening: Erosión seguida de dilatación condicional. Esqueletización Práctico 5. Ejercicio 4 El conjunto de puntos que se encuentra equidistante de su contorno 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 divide No divide if((Pd[i]!=max)&& (noDivide(M)))Pd[i]=max; Modelos de color HSV (Hue-Saturation-Value) H: Color S: Saturación o Pureza (Cuanto esta diluido el color) V: Valor (Representación de la intensidad) Modelos de color Práctico 6. Ejercicio 3 public static int[] RGBaHSV(int r, int g, int b) { float max=-2,min=300; max = maximo(g,r,b) min = minimo(r,g,b) if(max==min) max+=0.2f; int[] hsv = new int[3]; hsv[2]=(int)max; hsv[1]=(int)((max-min)/max); if(r==(int)max && g>=b) hsv[0]=(int)(60*(g-b)/(max-min))+0; else { if(r==(int)max && g<b) hsv[0]=(int)(60*(b-g)/(max-min))+360; else { if(g==(int)max) hsv[0]=(int)(60*(b-r)/(max-min))+120; else if(b==(int)max) hsv[0]=(int)(60*(r-b)/(max-min))+240; } } return hsv; } Modelos de color Práctico 6. Ejercicio 3