OpenCV_Dft.java
package Ch14;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import java.util.ArrayList;
import java.util.List;
public class OpenCV_Dft {
static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);};
public static void main( String[] args )
{
try{
Mat source = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena.jpg ",Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
/////////////part1 optimizeImageDim
// optimize the dimension of the loaded image
// init
Mat padded=new Mat();
// get the optimal rows size for dft
int addPixelRows = Core.getOptimalDFTSize(source.rows());
// get the optimal cols size for dft
int addPixelCols = Core.getOptimalDFTSize(source.cols());
// apply the optimal cols and rows size to the image
//Die Berechnungsgeschwindigkeit ist am besten, wenn die Skala 2, 3 und 5 Mal angepasst wird. Schnelle Berechnung,
//將 Importierte Statue Kabuki Ausstellung Ankunft Die beste Skala,Additives Bildelement zur Initialisierung 0
Core.copyMakeBorder(source, padded, 0, addPixelRows - source.rows(), 0, addPixelCols - source.cols(),1, Scalar.all(0));
// return padded;
//end part1 optimizeImageDim
//System.out.println(padded.dump());
//main
//Verteilen von Tachibana Cabrio Minabe Kazuobu profitabler Raum 兩 Individuell 圖 Statue 值.傅 Tachiba-Konvertierungsergebnis multipliziert, verursacht diese sehr geringe Menge an häufigem Flächengewinn-Existenz-Float-Typ, durchschnittlicher Betrag Nummer eins außerhalb der Passage. 來 Gewinn-Existenz-Verbundteil:
padded.convertTo(padded, CvType.CV_32F);
List<Mat> planes = new ArrayList<Mat>();
Mat complexImage=new Mat();
// prepare the image planes to obtain the complex image
planes.add(padded);
planes.add(Mat.zeros(padded.size(), CvType.CV_32F));
// prepare a complex image for performing the dft
////Nachausstellung der Ausstellung
Core.merge(planes, complexImage);
// dft
//Progressive diskrete Tachiba-Umwandlung,Konvertierungsergebnis existiert Primitive Mat Rokujin
Core.dft(complexImage, complexImage);
//Mat magnitude = new Mat();
// optimize the image resulting from the dft operation
/// part2 createOptimizedMagnitude
// init
List<Mat> newPlanes = new ArrayList<Mat>();
Mat mag = new Mat();
// split the comples image in two planes
//將 Mehrfachumwandlungsbogengrad.
Core.split(complexImage, newPlanes);
// compute the magnitude
Core.magnitude(newPlanes.get(0), newPlanes.get(1), mag);
// move to a logarithmic scale
//Cabrio Waage
Core.add(mag, Scalar.all(1), mag);
Core.log(mag, mag);
// optionally reorder the 4 quadrants of the magnitude image
////////////////part3 shiftDFT
//Schnitt- und Exzenterlinie
mag = mag.submat(new Rect(0, 0, mag.cols() & -2, mag.rows() & -2));
//Schwere Teilung
int cx = mag.cols() / 2;
int cy = mag.rows() / 2;
//Obere linke Ecke-ROI für den Aufbau eines Quadranten
Mat q0 = new Mat(mag, new Rect(0, 0, cx, cy));
//Obere rechte Ecke
Mat q1 = new Mat(mag, new Rect(cx, 0, cx, cy));
//Untere linke Ecke
Mat q2 = new Mat(mag, new Rect(0, cy, cx, cy));
//Untere rechte Ecke
Mat q3 = new Mat(mag, new Rect(cx, cy, cx, cy));
Mat tmp = new Mat();
q0.copyTo(tmp);
q3.copyTo(q0);
//Quadrant austauschen:Oben links 與 unten rechts
tmp.copyTo(q3);
q1.copyTo(tmp);
q2.copyTo(q1);
//Quadrant austauschen:Oben rechts, unten links
tmp.copyTo(q2);
//end part3 shiftDFT
// normalize the magnitude image for the visualization since both JavaFX
// and OpenCV need images with value between 0 and 255
//Normalisierung[0,255]Reichweite
Core.normalize(mag, mag, 0,255, Core.NORM_MINMAX);
//end part2 createOptimizedMagnitude
//Imgproc.GaussianBlur(source1, processBlur,new Size(GaussianKernelSize,GaussianKernelSize),0,0);
//Mat lastoutput = ConvertDFTToImage(Dft,gaussianFilter,output);
//source.convertTo(destination, -1, alpha, beta);
Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena-dft.jpg ", mag);
//main end
}catch (Exception e) {
System.out.println("error: " + e.getMessage());
}
}
}
Recommended Posts