私の主な関心分野は生物医学画像処理です。私は一連の生物医学画像を持っており、それらの間のフェーズを見つける必要があります。
画像間の位相を計算するために、私は位相相関を使用していますが、それをどのように行っているのかわかりません。「JavaAdvancedImaging」ライブラリを使用していますが、コードは次のとおりです。
BufferedImage first = grayscale(first);
BufferedImage second = grayscale(second);
RenderedOp dftFirst = DFTDescriptor.create(PlanarImage.wrapRenderedImage(first), DFTDescriptor.SCALING_NONE, DFTDescriptor.REAL_TO_COMPLEX, null);
RenderedOp dftSecond = DFTDescriptor.create(PlanarImage.wrapRenderedImage(second), DFTDescriptor.SCALING_NONE, DFTDescriptor.REAL_TO_COMPLEX, null);
RenderedOp conj = ConjugateDescriptor.create(dftSecond, null);
RenderedOp conv = MultiplyComplexDescriptor.create(dftFirst, conj, null);
RenderedOp abs = AbsoluteDescriptor.create(conv, null);
RenderedOp R = DivideComplexDescriptor.create(conv, abs, null);
RenderedOp idft = IDFTDescriptor.create(R, IDFTDescriptor.SCALING_DIMENSIONS, IDFTDescriptor.COMPLEX_TO_COMPLEX, null);
RenderedOp magnitude = MagnitudeDescriptor.create(idft, null);
RenderedOp shift = PeriodicShiftDescriptor.create(magnitude, new Integer(magnitude.getWidth() / 2), new Integer(magnitude.getHeight() / 2), null);
RenderedOp opExtrema = ExtremaDescriptor.create(shift, new ROIShape(shift.getBounds()), 1, 1, Boolean.TRUE, 1, null);
int[] maxLocation = (int[])((List[])opExtrema.getProperty("maxLocations"))[0].get(0);
double[][] extrema = (double[][])opExtrema.getProperty("extrema");
double c = 255.0 / (extrema[1][0] - extrema[0][0]);
double o = -extrema[0][0] * c;
System.out.println("Maximum value " + extrema[1][0] + " found at (" + maxLocation[0] + "," + maxLocation[1] + ")");
私の質問は次のとおりです。
- JAIの位相相関のステップは正しいですか?
- JAIの画像結果から位相サイズを取得するにはどうすればよいですか?
ありがとうございました
アップデート
ポイント2.解決済み
int deltaX = maxLocation[0] - (conv.getWidth() / 2);
int deltaY = maxLocation[1] - (conv.getHeight() / 2);