Какая разница между EDISON и cvPyrMeanShiftFiltering

Я делаю несколько сотрудников со средней сегментацией сдвига. Я нашел код EDISON (http://coewww.rutgers.edu/riul/research/code/EDISON/), который реализовал хороший. Кроме того, opencv имеет функцию под названием cvPyrMeanShiftFiltering.

Но на следующем рисунке они различны. В системе EDISON два параметра: 7 и 6.5. В opencv я использую cvPyrMeanShiftFiltering(result, result, 7, 6.5,level); (результат уже преобразован в LUV). Границы в правом изображении не ясны. Я также попытался level = 0...

Может ли кто-нибудь помочь? Я хочу добиться того же результата с помощью openCV. (Я уже реализовал шаг кластеризации)

1 ответ

Я попробовал другой код из rsbweb... и эффект намного лучше, чем openCV!

Вот мой новый результат

Я изменил часть кода, используя Luv, а не YIQ, чтобы получить лучший результат. Цветовое уравнение от easyrgb

Вот мой код

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class test {
public static void main(String[] args) throws IOException {
 BufferedImage img = ImageIO.read(new File("2.png"));
 filterRGBImage(img);
 ImageIO.write(img, "png", new File("3.png"));
}
private static int rad = 10, rad2=rad*rad;
private static ****** radCol2 = Math.pow(10,2);
private static void RGB2XYZ(****** rgb[], ****** xyz[])
{
 ****** var_R = ( rgb[0] / 255. ),var_G = ( rgb[1] / 255. ),var_B = ( rgb[2] / 255. ); 
 if ( var_R > 0.04045 ) 
 var_R = Math.pow(( ( var_R + 0.055 ) / 1.055 ),2.4);
 else 
 var_R = var_R / 12.92;
 if ( var_G > 0.04045 ) 
 var_G = Math.pow( ( var_G + 0.055 ) / 1.055 , 2.4);
 else 
 var_G = var_G / 12.92;
 if ( var_B > 0.04045 ) 
 var_B = Math.pow( ( var_B + 0.055 ) / 1.055 ,2.4);
 else 
 var_B = var_B / 12.92;
 var_R = var_R * 100;
 var_G = var_G * 100;
 var_B = var_B * 100;
 xyz[0] = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805;
 xyz[1] = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722;
 xyz[2] = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505;
}
private static void XYZ2RGB(****** xyz[], ****** rgb[])
{
 ****** var_X = xyz[0] / 100, var_Y = xyz[1] / 100 , var_Z = xyz[2] / 100;
 ****** var_R = var_X * 3.2406 + var_Y * -1.5372 + var_Z * -0.4986,
 var_G = var_X * -0.9689 + var_Y * 1.8758 + var_Z * 0.0415,
 var_B = var_X * 0.0557 + var_Y * -0.2040 + var_Z * 1.0570;
 if ( var_R > 0.0031308 ) 
 var_R = 1.055 * Math.pow(var_R, 1 / 2.4 ) - 0.055;
 else 
 var_R = 12.92 * var_R;
 if ( var_G > 0.0031308 ) 
 var_G = 1.055 * Math.pow(var_G , 1 / 2.4 ) - 0.055;
 else 
 var_G = 12.92 * var_G;
 if ( var_B > 0.0031308 ) 
 var_B = 1.055 * Math.pow(var_B ,1 / 2.4 ) - 0.055;
 else 
 var_B = 12.92 * var_B;
 rgb[0] = var_R * 255;
 rgb[1] = var_G * 255;
 rgb[2] = var_B * 255 ;
}
private static void XYZ2Luv(****** xyz[], ****** luv[])
{
 ****** var_U = ( 4 * xyz[0] ) / ( xyz[0] + ( 15 * xyz[1] ) + ( 3 * xyz[2] ) ),
 var_V = ( 9 * xyz[1] ) / ( xyz[0] + ( 15 * xyz[1] ) + ( 3 * xyz[2] ) ),
 var_Y = xyz[1] / 100;
 if ( var_Y > 0.008856 ) 
 var_Y = Math.pow(var_Y, 1./3 );
 else 
 var_Y = ( 7.787 * var_Y ) + ( 16. / 116 );
 ****** ref_X = 95.047, ref_Y = 100.000, ref_Z = 108.883;
 ****** ref_U = ( 4 * ref_X ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) ),
 ref_V = ( 9 * ref_Y ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) );
 luv[0] = ( 116 * var_Y ) - 16;
 luv[1] = 13 * luv[0] * ( var_U - ref_U );
 luv[2] = 13 * luv[0] * ( var_V - ref_V );
}
private static void Luv2XYZ(****** luv[],****** xyz[])
{
 ****** var_Y = ( luv[0] + 16 ) / 116;
 if ( Math.pow(var_Y,3) > 0.008856 )
 var_Y = Math.pow(var_Y,3);
 else 
 var_Y = ( var_Y - 16./ 116 ) / 7.787;
 ****** ref_X = 95.047 ,ref_Y = 100.000,ref_Z = 108.883;
 ****** ref_U = ( 4 * ref_X ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) ),
 ref_V = ( 9 * ref_Y ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) );
 ****** var_U = luv[1] / ( 13 * luv[0] ) + ref_U,
 var_V =luv[2] / ( 13 * luv[0] ) + ref_V;
 xyz[1] = var_Y * 100;
 xyz[0] = - ( 9 * xyz[1] * var_U ) / ( ( var_U - 4 ) * var_V - var_U * var_V );
 xyz[2] = ( 9 * xyz[1] - ( 15 * var_V * xyz[1]) - ( var_V * xyz[0] ) ) / ( 3 * var_V ); 
}
//http://rsbweb.nih.gov/ij/plugins/download/Mean_Shift.java
public static void filterRGBImage(BufferedImage ip) {
 int width = ip.getWidth();
 int height = ip.getHeight();
 ******[][][] pixelsf = new ******[width][height][3];
 for (int y=0; y<height; y++)="" {="" for="" (int="" x="0;" x<width;="" x++)="" int="" argb="ip.getRGB(x,y);" r="(argb">> 16) & 0xff;
 int g = (argb >> 8) & 0xff;
 int b = (argb) & 0xff;
 // YIQ
 /*pixelsf[x][y][0] = 0.299f *r + 0.587f *g + 0.114f *b;
 pixelsf[x][y][1] = 0.5957f *r - 0.2744f*g - 0.3212f *b; 
 pixelsf[x][y][2] = 0.2114f *r - 0.5226f*g + 0.3111f *b;*/
 ****** tmp[]={r,g,b},tmp2[]={0,0,0};
 RGB2XYZ(tmp,tmp2);
 XYZ2Luv(tmp2,pixelsf[x][y]);
 }
 }
 ****** shift = 0;
 int iters = 0;
 for (int y=0; y<height; y++)="" {="" for="" (int="" x="0;" x<width;="" x++)="" int="" xc="x;" yc="y;" xcold,="" ycold;="" ******="" ycold,="" icold,="" qcold;="" ic="pixelsf[x][y][1];" qc="pixelsf[x][y][2];" iters="0;" do="" xcold="xc;" ycold="yc;" icold="Ic;" qcold="Qc;" float="" mx="0;" my="0;" mi="0;" mq="0;" num="0;" ry="-rad;" <="rad;" ry++)="" y2="yc" +="" ry;="" if="" (y2="">= 0 && y2 < height) {
 for (int rx=-rad; rx <= rad; rx++) {
 int x2 = xc + rx; 
 if (x2 >= 0 && x2 < width) {
 //if (ry*ry + rx*rx <= rad2) {
 ****** Y2 = pixelsf[x2][y2][0];
 ****** I2 = pixelsf[x2][y2][1];
 ****** Q2 = pixelsf[x2][y2][2];
 ****** dY = Yc - Y2;
 ****** dI = Ic - I2;
 ****** dQ = Qc - Q2;
 if (dY*dY+dI*dI+dQ*dQ <= radCol2) {
 mx += x2;
 my += y2;
 mY += Y2;
 mI += I2;
 mQ += Q2;
 num++;
 }
 //}
 }
 }
 }
 }
 ****** num_ = 1./num;
 Yc = mY*num_;
 Ic = mI*num_;
 Qc = mQ*num_;
 xc = (int) (mx*num_+0.5);
 yc = (int) (my*num_+0.5);
 int dx = xc-xcOld;
 int dy = yc-ycOld;
 ****** dY = Yc-YcOld;
 ****** dI = Ic-IcOld;
 ****** dQ = Qc-QcOld;
 shift = dx*dx+dy*dy+dY*dY+dI*dI+dQ*dQ; 
 iters++;
 }
 while (shift > 3 && iters < 100);
 ****** tmp[]={Yc,Ic,Qc},tmp2[]={0,0,0};
 Luv2XYZ(tmp,tmp2);
 XYZ2RGB(tmp2,tmp);
 int r_ = (int) tmp[0];
 int g_ = (int) tmp[1];
 int b_ = (int) tmp[2];
 ip.setRGB(x, y, (0xFF<<24)|(r_<<16)|(g_<<8)|b_);
 }
 }
}
}
</height;></height;>

licensed under cc by-sa 3.0 with attribution.