Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用JAVA计算图像的熵_Java_Matlab_Image Processing_Encryption - Fatal编程技术网

用JAVA计算图像的熵

用JAVA计算图像的熵,java,matlab,image-processing,encryption,Java,Matlab,Image Processing,Encryption,作为我Java学术项目的一部分,我正在研究一个图像加密程序。该项目的输出将是一个加密图像。现在我需要计算原始图像和加密图像的熵,以便根据此公式进行分析 如何使用Java根据这个方程找到图像的熵这是我开发的代码,使用它计算的熵值与Matlab中的熵()一致,因此我假设它是正确的,请告诉我其他情况 public static double getShannonEntropy_Image(BufferedImage actualImage){ List<String> v

作为我Java学术项目的一部分,我正在研究一个图像加密程序。该项目的输出将是一个加密图像。现在我需要计算原始图像和加密图像的熵,以便根据此公式进行分析


如何使用Java根据这个方程找到图像的熵这是我开发的代码,使用它计算的熵值与Matlab中的熵()一致,因此我假设它是正确的,请告诉我其他情况

      public static double getShannonEntropy_Image(BufferedImage actualImage){
 List<String> values= new ArrayList<String>();
             int n = 0;
             Map<Integer, Integer> occ = new HashMap<>();
             for(int i=0;i<actualImage.getHeight();i++){
                 for(int j=0;j<actualImage.getWidth();j++){
                   int pixel = actualImage.getRGB(j, i);
                   int alpha = (pixel >> 24) & 0xff;
                   int red = (pixel >> 16) & 0xff;
                   int green = (pixel >> 8) & 0xff;
                   int blue = (pixel) & 0xff;
 //0.2989 * R + 0.5870 * G + 0.1140 * B greyscale conversion
//System.out.println("i="+i+" j="+j+" argb: " + alpha + ", " + red + ", " + green + ", " + blue);
                   int d= (int)Math.round(0.2989 * red + 0.5870 * green + 0.1140 * blue);
                  if(!values.contains(String.valueOf(d)))
                      values.add(String.valueOf(d));
                  if (occ.containsKey(d)) {
                      occ.put(d, occ.get(d) + 1);
                  } else {
                      occ.put(d, 1);
                  }
                  ++n;
           }
        }
        double e = 0.0;
        for (Map.Entry<Integer, Integer> entry : occ.entrySet()) {
             int cx = entry.getKey();
             double p = (double) entry.getValue() / n;
             e += p * log2(p);
        }
 return -e;
}
公共静态双getShannonEntropy_映像(BuffereImage实现映像){
列表值=新的ArrayList();
int n=0;
Map occ=newhashmap();
对于(int i=0;i 24)&0xff;
int red=(像素>>16)和0xff;
绿色整数=(像素>>8)&0xff;
蓝色整数=(像素)&0xff;
//0.2989*R+0.5870*G+0.1140*B灰度转换
//System.out.println(“i=“+i+”j=“+j+”argb:“+alpha+”、“+red+”、“+green+”、“+blue”);
整数d=(整数)数学四舍五入(0.2989*红色+0.5870*绿色+0.1140*蓝色);
如果(!values.contains(String.valueOf(d)))
value.add(String.valueOf(d));
如果(occ.containsKey(d)){
occ.put(d,occ.get(d)+1);
}否则{
货币监理署署长(d,1);
}
++n;
}
}
双e=0.0;
对于(Map.Entry:occ.entrySet()){
int cx=entry.getKey();
double p=(double)entry.getValue()/n;
e+=p*log2(p);
}
返回-e;
}

问题是什么?抱歉,更新了问题您希望有人为您编写完整的代码吗?请先理解逻辑
p_i
是符号
i
出现的概率
i
1
变为
n
。在灰度图像中,
i
将取0-255之间的值。因此,您只需将
i
发生的总次数除以图像中的像素总数即可。这就是你的
p_i
。对
i
的所有值执行此操作,并使用公式(4)进行计算。这应该一点也不难。那么我应该先转换成灰度吗?