【发布时间】:2017-05-10 14:21:55
【问题描述】:
这里我尝试计算图像的方差,从这张图像中每种颜色的方差开始(我已经计算了红色的方差,但结果是-1)
我使用以下公式“var (x) = E (x²) -E (x) ²”。
private void openActionPerformed(java.awt.event.ActionEvent evt) {
LoadImage loadImage = new LoadImage(null);
int w, h;
BufferedImage image;
float somR = 0;
int somG = 0;
int somB = 0;
int valR[][];
int[][] valG;
int valB[][];
double meanR = 0;
double meanG = 0;
double meanB = 0;
int nbpixl = 0;
try {
if (loadImage.loadImage(jScrollPane1)) {
int pixel = 0;
image = loadImage.getImage();
w = image.getWidth();
h = image.getHeight();
System.out.println("width, height: " + w + ", " + h);
nbpixl = w * h;
valR = new int[h][w];
valB = new int[h][w];
valG = new int[h][w];
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
pixel = image.getRGB(j, i);
//rgb argb
//int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
valR[i][j] = red;
somR += red;
valG[i][j] = green;
somG += green;
valB[i][j] = blue;
somB += blue;
System.out.println("");
}
}
System.out.println("red " + somR);
System.out.println("green " + somG);
System.out.println("blue " + somB);
meanR = somR / nbpixl;
meanG = somG / nbpixl;
meanB = somB / nbpixl;
System.out.println("meanR" + meanR);
System.out.println("meanV" + meanG);
System.out.println("meanB" + meanB);
float summSquareR = somR * somR;
float meanSquareR = summSquareR / nbpixl;
System.out.println("summSquareR" + summSquareR);
System.out.println("meanSquareR" + meanSquareR);
//float varRrr=(float) (meanSquareR-meanR*meanR);
//var (x) = E (x²) -E (x) ²
byte varR = (byte) (255f * (meanSquareR - meanR * meanR));
// byte varG=(byte)(225f*((somG*somG)/nbpixl)-((somG/nbpixl)*(somG/nbpixl)));
System.out.println(somB + "\t" + somR + "\t" + somG);
System.out.println("varR\t" + varR);
}
} catch (IOException ex) {
Logger.getLogger(var_img.class.getName()).log(Level.SEVERE, null, ex);
}
}
对于结果 宽、高:259、194
红色 5137653.0
绿色 4165933
蓝色 4142841
平均R102.24999237060547
平均V82.0
平均B82.0
summSquareR2.63954786E13
meanSquareR5.2532496E8
4142841 5137653.0 4165933
varR -1
【问题讨论】:
-
乍一看好像溢出了。你为什么要投到
byte? -
我有两个原因 1 是在图像处理中,我们处理实际值介于 0 和 1 之间的强度。这就是为什么我必须将整数值 0-255 转换为实际值 0 ... 1 *2 * 将是此代码的延续,如果帧方差超过阈值,我想选择一个阈值(exp 0.25)以将图像每次切割成四(四叉树)
-
我试过 float Float varR = (float) ((meanSquareR - meanR * meanR));结果** varR 5.25314496E8 **
-
再看一遍代码后,我看不出你在哪里计算平均值,或者实际的variance (as I know it) - 也许其他人可以更好地理解你的代码和问题,抱歉......
-
代替
getRGB(),使用getSamples(),作为example。
标签: java swing image-processing variance