bool regionMerge::apply(const imatrix& srcmask, const dmatrix& simMat, const dvector& thresholds, imatrix& destmask) const { int i,j; const dvector& thrs = thresholds; ivector eLab(simMat.rows()); for (i=0;i<eLab.size();++i) eLab.at(i) = i; double a; for (j=0;j<simMat.rows();++j) for (i=0;i<simMat.columns();++i) { if (simMat.at(j,i) > (a=max(thrs.at(j),thrs.at(i))) ) { // cout<<j<<" "<<i<<" "<<simMat.at(j,i)<<" "<<a<<endl; if (eLab.at(j)>eLab.at(i)) { eLab.at(j)=eLab.at(i); } else { eLab.at(i)=eLab.at(j); } } } // now correct the labels for (j=eLab.size()-1;j>=0;--j) { //todo i = j; while (eLab.at(i) != i) { i=eLab.at(i); } eLab.at(j) = i; } destmask.resize(srcmask.size(),0,false,false); for (j=0;j<srcmask.rows();++j) for (i=0;i<srcmask.columns();++i) { destmask.at(j,i) = eLab.at(srcmask.at(j,i)); } return true; };
/* * operates on a copy of the given %parameters. * @param srcmask source mask. Each object must be represented by one * label. * @param simMat The similarity matrix. The size of the matrix must * be at least equal the number of labels plus one. * @param destMask resulting mask with merged objects. * @return true if apply successful or false otherwise. */ bool regionMerge::apply(const imatrix& srcmask, const dmatrix& simMat, imatrix& destmask) const { int i,j; ivector eLab(simMat.rows()); const double thr = getParameters().threshold; for (i=0;i<eLab.size();++i) { eLab.at(i) = i; } for (j=0;j<simMat.rows();++j) { for (i=0;i<simMat.columns();++i) { if (simMat.at(j,i) > thr) { if (eLab.at(j)>eLab.at(i)) { eLab.at(j)=eLab.at(i); } else { eLab.at(i)=eLab.at(j); } } } } // now correct the labels for (j=eLab.size()-1;j>=0;--j) { i = j; while (eLab.at(i) != i) { i=eLab.at(i); } eLab.at(j) = i; } destmask.resize(srcmask.size(),0,false,false); for (j=0;j<srcmask.rows();++j) for (i=0;i<srcmask.columns();++i) { destmask.at(j,i) = eLab.at(srcmask.at(j,i)); } return true; };
// applies the histogramMethod for the type boundary Zero bool kNearestNeighFilter::histogramMethodZero(const imatrix& src, imatrix& dest) const { int i,j,row,col;//index const int limit = sizeOfKernel/2; //half size of the kernel const int rowSize = src.rows(); const int columnSize = src.columns(); const int lastCol = src.lastColumn()-limit; const int lastRow = src.lastRow()-limit; ivector histogram(histoSize,0); //the histogram for a channel8 dest.resize(src.size(),ubyte(0),false,false); //runs area 4,5,6 for(row=limit;row<=lastRow;++row) { const int r = row+limit; histogram.fill(0); col=0; //number of 0's are known histogram.at(0) = sizeOfKernel*(sizeOfKernel-limit-1); for(i=row-limit;i<=r;++i) for(j=0;j<=limit;++j) ++histogram.at(src.at(i,j)); dest.at(row,col) = getMostLabel(histogram,src,row,col); // the kernel at the position between the border and the image while(col < limit) { histogram.at(0) -= sizeOfKernel; // cut all the 0 in the leftmost column ++col; j = col+limit; // for each pixel in the rightmost column for(i=row-limit;i<=r;++i) ++histogram.at(src.at(i,j)); dest.at(row,col) = getMostLabel(histogram,src,row,col); } //runs area 5 histogramMethodMiddle(src,dest,histogram,row,col); // area 6 col = lastCol; while(col < (columnSize-1)) { j = col-limit; for(i=row-limit;i<=r;++i) --histogram.at(src.at(i,j)); ++col; histogram.at(0) += sizeOfKernel; dest.at(row,col) = getMostLabel(histogram,src,row,col); } } // runs area 1,2,3 for(row=0;row<limit;++row) { const int r=row+limit; // runs middle top rows (area 2) for(col=limit;col<=lastCol;++col) { histogram.fill(0); const int c=col+limit; histogram.at(0) = sizeOfKernel*(sizeOfKernel-(limit+1)-row); for(i=0;i<=r;++i) for(j=col-limit;j<=c;++j) ++histogram.at(src.at(i,j)); dest.at(row,col) = getMostLabel(histogram,src,row,col) ; } // runs left top corner (area 1); for(col=0;col<limit;++col) { histogram.fill(0); const int c=col+limit; histogram.at(0) = sizeOfKernel*sizeOfKernel-(limit+1)*(limit+1+row+col)-col*row; for(i=0;i<=r;++i) for(j=0;j<=c;++j) ++histogram.at(src.at(i,j)); dest.at(row,col) = getMostLabel(histogram,src,row,col); } // runs top right corner (area 3) for(col=lastCol+1;col<=columnSize-1;++col) { histogram.fill(0); const int c=columnSize-1; histogram.at(0) = sizeOfKernel*sizeOfKernel -(limit+1)*(limit+1+row+(columnSize-1-col))-row*(columnSize-1-col); for(i=0;i<=r;++i) for(j=col-limit;j<=c;++j) ++histogram.at(src.at(i,j)); dest.at(row,col) = getMostLabel(histogram,src,row,col); } } //runs the rows at the bottom (area 7,8,9) for(row=lastRow+1;row<=rowSize-1;++row) { //runs middle bottom rows (area 8) for(col=limit;col<=lastCol;++col) { histogram.fill(0); const int c=col+limit; histogram.at(0) = sizeOfKernel*(sizeOfKernel-(limit+1)-(rowSize-1-row)); for(i=row-limit;i<=rowSize-1;++i) for(j=col-limit;j<=c;++j) ++histogram.at(src.at(i,j)); dest.at(row,col) = getMostLabel(histogram,src,row,col); } // runs bottom left corner (area 7) for(col=0;col<limit;++col) { histogram.fill(0); const int c=col+limit; histogram.at(0) = sizeOfKernel*sizeOfKernel-(limit+1)* (limit+1+(rowSize-1-row)+col)-col*(rowSize-1-row); for(i=row-limit;i<=rowSize-1;++i) for(j=0;j<=c;++j) ++histogram.at(src.at(i,j)); dest.at(row,col) = getMostLabel(histogram,src,row,col); } //runs bottom right corner (area 9) for(col=lastCol+1;col<=columnSize-1;++col) { histogram.fill(0); const int c = columnSize-1; histogram.at(0) = sizeOfKernel*sizeOfKernel -(limit+1)*(limit+1+(rowSize-1-row)+(columnSize-1-col)) -(rowSize-1-row)*(columnSize-1-col); for(i=row-limit;i<=rowSize-1;++i) for(j=col-limit;j<=c;++j) ++histogram.at(src.at(i,j)); dest.at(row,col) = getMostLabel(histogram,src,row,col); } } return true; };
// applies the histogramMethod for the type boundary Mirror bool kNearestNeighFilter::histogramMethodMirror(const imatrix& src, imatrix& dest) const { int i,j,row,col;//index const int limit = sizeOfKernel/2; //half size of the kernel const int rowSize = src.rows(); const int columnSize = src.columns(); const int lastCol = src.lastColumn()-limit; const int lastRow = src.lastRow()-limit; ivector histogram(histoSize,0); dest.resize(src.size(),0,false,false); //runs through the src's columns,inside the image for(row=limit;row<=lastRow;++row) { histogram.fill(0); col=0; const int c=col+limit; const int r = row+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(j<0) ++histogram.at(src.at(i,-j-1)); else // if(j>=0) ++histogram.at(src.at(i,j)); } dest.at(row,col) = getMostLabel(histogram,src,row,col); while(col < limit) { j = col-limit; for(i=row-limit;i<=r;++i) --histogram.at(src.at(i,-j-1)); ++col; j=col+limit; for(i=row-limit;i<=r;++i) ++histogram.at(src.at(i,j)); dest.at(row,col) = getMostLabel(histogram,src,row,col); } // runs inside the image histogramMethodMiddle(src,dest,histogram,row,col); col=lastCol; while(col < (columnSize-1)) { j = col-limit; for(i=row-limit;i<=r;++i) --histogram.at(src.at(i,j)); ++col; j=col+limit; for(i=row-limit;i<=r;++i) ++histogram.at(src.at(i,columnSize-1+(columnSize-j))); dest.at(row,col) = getMostLabel(histogram,src,row,col); } } // areas 1,2,3 for(row=0;row<limit;++row) { const int r=row+limit; // runs middle top rows (area 2) for(col=limit;col<=lastCol;++col) { histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<0) ++histogram.at(src.at(-i-1,j)); else //if(i>=0) ++histogram.at(src.at(i,j)); } dest.at(row,col) = getMostLabel(histogram,src,row,col); } // runs top left corner (area 1) for(col=0;col<limit;++col) { histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<0 && j<0) ++histogram.at(src.at(-i-1,-j-1)); else if(i>=0 && j<0) ++histogram.at(src.at(i,-j-1)); else if(i<0 && j>=0) ++histogram.at(src.at(-i-1,j)); else //if(i>=0 && j>=0) ++histogram.at(src.at(i,j)); } dest.at(row,col) = getMostLabel(histogram,src,row,col); } //runs top right corner (area 3) for(col=lastCol+1;col<columnSize;++col) { histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<0 && j<=columnSize-1) ++histogram.at(src.at(-i-1,j)); else if(i<0 && j>columnSize-1) ++histogram.at(src.at(-i-1,columnSize-1+(columnSize-j))); else if(i>=0 && j>columnSize-1) ++histogram.at(src.at(i,columnSize-1+(columnSize-j))); else //if(i>=0 && j<=columnSize-1) ++histogram.at(src.at(i,j)); } dest.at(row,col) = getMostLabel(histogram,src,row,col); } } //runs bottom rows (areas 7,8,9) for(row=lastRow+1;row<=rowSize-1;++row) { const int r=row+limit; //runs middle bottom rows (area 8) for(col=limit;col<=lastCol;++col) { histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<=rowSize-1) ++histogram.at(src.at(i,j)); else // if(i>rowSize-1) ++histogram.at(src.at(rowSize-1+(rowSize-i),j)); } dest.at(row,col) = getMostLabel(histogram,src,row,col); } //runs bottom left corner (area 7) for(col=0;col<limit;++col) { histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<=rowSize-1 && j<0) ++histogram.at(src.at(i,-j-1)); else if(i<=rowSize-1 && j>=0) ++histogram.at(src.at(i,j)); else if(i>rowSize-1 && j<0) ++histogram.at(src.at(rowSize-1+(rowSize-i),-j-1)); else //if(i>rowSize-1 && j>=0) ++histogram.at(src.at(rowSize-1+(rowSize-i),j)); } dest.at(row,col) = getMostLabel(histogram,src,row,col); } //runs bottom right corner (area 9) for(col=lastCol+1;col<columnSize;++col) { histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<=rowSize-1 && j<=columnSize-1) ++histogram.at(src.at(i,j)); else if(i<=rowSize-1 && j>columnSize-1) ++histogram.at(src.at(i,columnSize-1+(columnSize-j))); else if(i>rowSize-1 && j<=columnSize-1) ++histogram.at(src.at(rowSize-1+(rowSize-i),j)); else //if(i>rowSize-1 && j>columnSize-1) ++histogram.at(src.at(rowSize-1+(rowSize-i), columnSize-1+(columnSize-j))); } dest.at(row,col) = getMostLabel(histogram,src,row,col); } } return true; };
// applies the histogramMethod for the type boundary Periodic bool kNearestNeighFilter::histogramMethodPeriodic(const imatrix& src, imatrix& dest) const { int i,j,row,col;//index ivector histogram(histoSize,0); const int limit = sizeOfKernel/2; //half size of the kernel const int rowSize = src.rows(); const int columnSize = src.columns(); const int lastCol = src.lastColumn()-limit; const int lastRow = src.lastRow()-limit; dest.resize(src.size(),0,false,false); //runs through the src's columns area 4,5,6 for(row=limit;row<=lastRow;++row) { histogram.fill(0); col=0; const int c = col+limit; const int r = row+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(j<0) ++histogram.at(src.at(i,j+columnSize)); else // if(j>=0) ++histogram.at(src.at(i,j)); } dest.at(row,col)=getMostLabel(histogram,src,row,col); while(col < limit) { j = col-limit; for(i=row-limit;i<=r;++i) --histogram.at(src.at(i,j+columnSize)); ++col; j=col+limit; for(i=row-limit;i<=r;++i) ++histogram.at(src.at(i,j)); dest.at(row,col) = getMostLabel(histogram,src,row,col); } //runs inside the image histogramMethodMiddle(src,dest,histogram,row,col); col=lastCol; while(col < (columnSize-1)) { j = col-limit; for(i=row-limit;i<=r;++i) --histogram.at(src.at(i,j)); // column of intensity,take off in the histogram ++col; j=col+limit; for(i=row-limit;i<=r;++i) ++histogram.at(src.at(i,j-columnSize)); dest.at(row,col) = getMostLabel(histogram,src,row,col); } } //runs top rows (area 1,2,3) for(row=0;row<limit;++row) { const int r=row+limit; for(col=limit;col<=lastCol;++col) { // runs top middle rows (area 2) histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<0) ++histogram.at(src.at(i+rowSize,j)); else //if(i>=0) ++histogram.at(src.at(i,j)); } dest.at(row,col) = getMostLabel(histogram,src,row,col); } for(col=0;col<limit;++col) { // runs top left corner (area 1) histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<0 && j<0) ++histogram.at(src.at(rowSize+i,columnSize+j)); else if(i>=0 && j<0) ++histogram.at(src.at(i,columnSize+j)); else if(i<0 && j>=0) ++histogram.at(src.at(rowSize+i,j)); else //if(i>=0 && j>=0) ++histogram.at(src.at(i,j)); } dest.at(row,col) = getMostLabel(histogram,src,row,col); } for(col=lastCol+1;col<columnSize;++col) { //runs top right corner area 3 histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<0 && j<=columnSize-1) ++histogram.at(src.at(rowSize+i,j)); else if(i<0 && j>columnSize-1) ++histogram.at(src.at(rowSize+i,j-columnSize)); else if(i>=0 && j>columnSize-1) ++histogram.at(src.at(i,j-columnSize)); else //if(i>=0 && j<=columnSize-1) ++histogram.at(src.at(i,j)); } dest.at(row,col) = getMostLabel(histogram,src,row,col); } } //runs bottom rows (area 7,8,9) for(row=lastRow+1;row<=rowSize-1;++row) { const int r=row+limit; for(col=limit;col<=lastCol;++col) { //runs middle botom rows histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<=rowSize-1) ++histogram.at(src.at(i,j)); else // if(i>rowSize-1) ++histogram.at(src.at(i-rowSize,j)); } dest.at(row,col) = getMostLabel(histogram,src,row,col); } for(col=0;col<limit;++col) { //runs bottom left corner histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<=rowSize-1 && j<0) ++histogram.at(src.at(i,columnSize+j)); else if(i<=rowSize-1 && j>=0) ++histogram.at(src.at(i,j)); else if(i>rowSize-1 && j<0) ++histogram.at(src.at(i-rowSize,columnSize+j)); else //if(i>rowSize-1 && j>=0) ++histogram.at(src.at(i-rowSize,j)); } dest.at(row,col) = getMostLabel(histogram,src,row,col); } for(col=lastCol+1;col<columnSize;++col) { //runs bottom right corner histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<=rowSize-1 && j<=columnSize-1) ++histogram.at(src.at(i,j)); else if(i<=rowSize-1 && j>columnSize-1) ++histogram.at(src.at(i,j-columnSize)); else if(i>rowSize-1 && j<=columnSize-1) ++histogram.at(src.at(i-rowSize,j)); else //if(i>rowSize-1 && j>columnSize-1) ++histogram.at(src.at(i-rowSize,j-columnSize)); } dest.at(row,col) = getMostLabel(histogram,src,row,col); } } return true; };
// applies the histogramMethod for the type boundary Constant bool kNearestNeighFilter::histogramMethodConstant(const imatrix& src, imatrix& dest) const { // image is divided in 9 areas, which are calc one by one // 1| 2 |3 // --------- // | | // 4| 5 |6 // | | // ---------- // 7| 8 |9 int i,j,row,col;//index ivector histogram(histoSize,0); const int rowSize = src.rows(); const int columnSize = src.columns(); const int limit = sizeOfKernel/2; //half size of the kernel const int lastCol = src.lastColumn()-limit; const int lastRow = src.lastRow()-limit; dest.resize(src.size(),0,false,false); //runs through the src's columns // (area:4,5,6) only kernels with full kernel-height for(row=limit;row<=lastRow;++row) { histogram.fill(0); // first full kernel (area4) col=0; const int r = row+limit; const int c = col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { //todo better if(j<0) ++histogram.at(src.at(i,0)); else// if(j>=0) ++histogram.at(src.at(i,j)); } dest.at(row,col)=getMostLabel(histogram,src,row,col); // rest (area 4) while(col < limit) { for(i=row-limit;i<=r;++i) --histogram.at(src.at(i,0)); ++col; j=col+limit; for(i=row-limit;i<=r;++i) ++histogram.at(src.at(i,j)); dest.at(row,col)=getMostLabel(histogram,src,row,col); } // area 5 histogramMethodMiddle(src,dest,histogram,row,col); // area 6 col=lastCol; while(col < (columnSize-1)) { j=col-limit; for(i=row-limit;i<=r;++i) --histogram.at(src.at(i,j)); ++col; j = columnSize-1; for(i=row-limit;i<=r;++i) ++histogram.at(src.at(i,j)); dest.at(row,col)=getMostLabel(histogram,src,row,col); } } // area 4,5,6 // areas 1,2,3,7,8,9 for(row=0;row<limit;++row) { //runs top rows (1,2,3) const int r=row+limit; // runs middle top rows (area 2) for(col=limit;col<=lastCol;++col) { histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<0) ++histogram.at(src.at(0,j)); else//if(i>=0) { ++histogram.at(src.at(i,j)); } dest.at(row,col)=getMostLabel(histogram,src,row,col); } // runs left top corner (area 1) for(col=0;col<limit;++col) { histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<0 && j<0) ++histogram.at(src.at(0,0)); else if(i>=0 && j<0) ++histogram.at(src.at(i,0)); else if(i<0 && j>=0) ++histogram.at(src.at(0,j)); else //if(i>=0 && j>=0) ++histogram.at(src.at(i,j)); } dest.at(row,col)=getMostLabel(histogram,src,row,col); } //runs right top corner (area 3) for(col=lastCol+1;col<columnSize;++col) { histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<0 && j<=columnSize-1) ++histogram.at(src.at(0,j)); else if(i<0 && j>columnSize-1) ++histogram.at(src.at(0,columnSize-1)); else if(i>=0 && j>columnSize-1) ++histogram.at(src.at(i,columnSize-1)); else //if(i>=0 && j<=columnSize-1) ++histogram.at(src.at(i,j)); } dest.at(row,col)=getMostLabel(histogram,src,row,col); } } for(row=lastRow+1;row<=rowSize-1;++row) { //runs bottom rows (7,8,9) const int r=row+limit; //runs middle bottom rows (area 8) for(col=limit;col<=lastCol;++col) { histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<=rowSize-1) ++histogram.at(src.at(i,j)); else // if(i>rowSize-1) ++histogram.at(src.at(rowSize-1,j)); } dest.at(row,col)=getMostLabel(histogram,src,row,col); } //runs left bottom corner (area 7) for(col=0;col<limit;++col) { histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<=rowSize-1 && j<0) ++histogram.at(src.at(i,0)); else if(i<=rowSize-1 && j>=0) ++histogram.at(src.at(i,j)); else if(i>rowSize-1 && j<0) ++histogram.at(src.at(rowSize-1,0)); else //if(i>rowSize-1 && j>=0) ++histogram.at(src.at(rowSize-1,j)); } dest.at(row,col)=getMostLabel(histogram,src,row,col); } //runs right bottom corner (area 9) for(col=lastCol+1;col<columnSize;++col){ histogram.fill(0); const int c=col+limit; for(i=row-limit;i<=r;++i) for(j=col-limit;j<=c;++j) { if(i<=rowSize-1 && j<=columnSize-1) ++histogram.at(src.at(i,j)); else if(i<=rowSize-1 && j>columnSize-1) ++histogram.at(src.at(i,columnSize-1)); else if(i>rowSize-1 && j<=columnSize-1) ++histogram.at(src.at(rowSize-1,j)); else //if(i>rowSize-1 && j>columnSize-1) ++histogram.at(src.at(rowSize-1,columnSize-1)); } dest.at(row,col)=getMostLabel(histogram,src,row,col); } } return true; };