D
Also mal zur Erklärung:
Man definiert ein Homogenitätskriterium (in meinem Fall die Farbwertdifferenz als euklidischer Abstand)
Ist das Kriterium erfüllt, bricht man ab, sonst teilt man das Bild in 4 Teile und testet jedes einzelne.
Ich habe nun das Problem, wenn ich das Bild teilen lasse, habe ich ab der 4 Stufe Fehler drin und nun wollte ich mir das Programm mal von jemand anderem anschauen um meinen Fehler zu finden.
Falls jemand Lust hat, kann er sich den Code mal ansehen:
void ORFindObject::smf(int x1, int y1, int x2, int y2, int tiefe)
{
int x,y,i,j;
int min=0,max=0,ende;
double chk;
double farbe_r=0, farbe_g=0, farbe_b=0;
QRgb px;
bild gfx;
gfx.d_min=5000;
gfx.d_max=0;
ende=20;
cout<<x1<< ", "<< y1<< " : "<< x2<< ", "<< y2<<endl;
if (tiefe<2)
{
cout<<"test"<<endl;
for(i=x1; i<x2; i++)
{
for(j=y1; j<y2; j++)
{
px=_image.pixel(i,j);
chk=((qRed(px))*qRed(px))+
(qGreen(px)*(qGreen(px))+
(qBlue(px))*(qBlue(px)));
chk=sqrt(chk);
if(gfx.d_min>chk)
{
gfx.d_min=chk;
gfx.min[0]=qRed(px);
gfx.min[1]=qGreen(px);
gfx.min[2]=qBlue(px);
}
if(gfx.d_max<chk)
{
gfx.d_max=chk;
gfx.max[0]=qRed(px);
gfx.max[1]=qGreen(px);
gfx.max[2]=qBlue(px);
}
farbe_r=farbe_r+qRed(px);
farbe_g=farbe_g+qGreen(px);
farbe_b=farbe_b+qBlue(px);
}
}
gfx.mean[0]=int(farbe_r/((x2-x1)*(y2-y1)));
gfx.mean[1]=int(farbe_g/((x2-x1)*(y2-y1)));
gfx.mean[2]=int(farbe_b/((x2-x1)*(y2-y1)));
chk=((gfx.max[0]-gfx.min[0])*(gfx.max[0]-gfx.min[0])+
(gfx.max[1]-gfx.min[1])*(gfx.max[1]-gfx.min[1])+
(gfx.max[2]-gfx.min[2])*(gfx.max[2]-gfx.min[2]));
chk=abs(sqrt(chk));
cout<<chk<<endl;
if(chk>ende)
{
cout<<"teile"<<endl;
for(i=x1; i<x2; i++)
{
_image.setPixel(i, ((y2+y1)/2), qRgb(255,255,0));
}
for(j=y1; j<y2; j++)
{
_image.setPixel(((x2+x1)/2), j, qRgb(255,255,0));
}
smf(x1,y1,((x2+x1)/2),((y2+y1)/2),tiefe+1);
smf(((x2+x1)/2+1),y1,x2,((y2+y1)/2),tiefe+1);
smf(x1,((y2+y1)/2+1),((x2+x1)/2),y2,tiefe+1);
smf(((x2+x1)/2+1),((y2+y1)/2+1),x2,y2,tiefe+1);
}
else
{
//cout<<"färbe"<<endl;
for(x=x1; x<x2; x++)
{
for(y=y1; y<y2; y++)
{
//chk=(max-min)/2;
//_image.setPixel(x, y, (farbe_r, farbe_g, farbe_b));
_image.setPixel(x, y, qRgb(gfx.mean[0], gfx.mean[1],gfx.mean[2]));
}
}
}
}
}
@RenéG
Der Alg funktioniert auf allen Farbbildern, ohne das der Farbraum betrachtet werden muß, da man einen Abstand definiert, der auch in jedem Farbraum umsetzbar ist.
ich hab meinen Fehler jetzt gefunden und auch hier schon berichtigt. Falls jemand nähere Informationen sucht, kann er sich an mich wenden oder einfach mal nach "split and merge" im Netzt suchen.
[ Dieser Beitrag wurde am 13.06.2003 um 19:08 Uhr von daishi editiert. ]