+void
+ImageFileView::OnScaleMinMax (wxCommandEvent& event)
+{
+ const ImageFile& rIF = GetDocument()->getImageFile();
+ double min, max;
+ if (! m_bMinSpecified && ! m_bMaxSpecified)
+ rIF.getMinMax (min, max);
+
+ if (m_bMinSpecified)
+ min = m_dMinPixel;
+ if (m_bMaxSpecified)
+ max = m_dMaxPixel;
+
+ DialogGetMinMax dialogMinMax (m_frame, "Set Image Minimum & Maximum", min, max);
+ int retVal = dialogMinMax.ShowModal();
+ if (retVal == wxID_OK) {
+ m_bMinSpecified = true;
+ m_bMaxSpecified = true;
+ m_dMinPixel = dialogMinMax.getMinimum();
+ m_dMaxPixel = dialogMinMax.getMaximum();
+ OnUpdate (this, NULL);
+ }
+}
+\r
+void\r
+ImageFileView::OnCompare (wxCommandEvent& event)\r
+{\r
+ std::vector<ImageFileDocument*> vecIF;\r
+ theApp->getCompatibleImages (GetDocument(), vecIF);\r
+ \r
+ if (vecIF.size() == 0) {\r
+ wxMessageBox("There are no compatible image files open for comparision", "No comparison images");\r
+ } else {\r
+ DialogGetComparisonImage dialogGetCompare(m_frame, "Get Comparison Image", vecIF, true);\r
+ \r
+ if (dialogGetCompare.ShowModal() == wxID_OK) {\r
+ const ImageFile& rIF = GetDocument()->getImageFile();\r
+ ImageFileDocument* pCompareDoc = dialogGetCompare.getImageFileDocument();\r
+ const ImageFile& rCompareIF = pCompareDoc->getImageFile();\r
+ std::ostringstream os;\r
+ double min, max, mean, mode, median, stddev;\r
+ rIF.statistics (min, max, mean, mode, median, stddev);\r
+ os << rIF.getFilename() << ": minimum=" << min << ", maximum=" << max << ", mean=" << mean << ", mode=" << mode << ", median=" << median << ", stddev=" << stddev << "\n";\r
+ rCompareIF.statistics (min, max, mean, mode, median, stddev);\r
+ os << pCompareDoc->GetFirstView()->GetFrame()->GetTitle().c_str() << ": minimum=" << min << ", maximum=" << max << ", mean=" << mean << ", mode=" << mode << ", median=" << median << ", stddev=" << stddev << "\n";\r
+ os << "\n";\r
+ double d, r, e;\r
+ rIF.comparativeStatistics (rCompareIF, d, r, e);\r
+ os << "Comparative Statistics: d=" << d << ", r=" << r << ", e=" << e << "\n";\r
+ *theApp->getLog() << os.str().c_str();\r
+ if (dialogGetCompare.getMakeDifferenceImage()) {\r
+ ImageFileDocument* pDifferenceDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));\r
+ if (! pDifferenceDoc) {\r
+ sys_error (ERR_SEVERE, "Unable to create image file");\r
+ return;\r
+ }\r
+ ImageFile& differenceImage = pDifferenceDoc->getImageFile();\r
+ \r
+ differenceImage.setArraySize (rIF.nx(), rIF.ny());\r
+ if (! rIF.subtractImages (rCompareIF, differenceImage)) {\r
+ pDifferenceDoc->DeleteAllViews();\r
+ return;\r
+ }\r
+ \r
+ wxString s = GetDocument()->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ differenceImage.labelsCopy (rIF, s.c_str());\r
+ s = pCompareDoc->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ differenceImage.labelsCopy (rCompareIF, s.c_str());\r
+ std::ostringstream osLabel;\r
+ osLabel << "Compare image " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() \r
+ << " and " << pCompareDoc->GetFirstView()->GetFrame()->GetTitle().c_str() << ": "\r
+ << os.str().c_str();\r
+ differenceImage.labelAdd (os.str().c_str());\r
+ if (theApp->getSetModifyNewDocs())\r
+ pDifferenceDoc->Modify(true);\r
+ pDifferenceDoc->UpdateAllViews(this);\r
+ pDifferenceDoc->GetFirstView()->OnUpdate (this, NULL);\r
+ }\r
+ wxMessageBox(os.str().c_str(), "Image Comparison");\r
+ }\r
+ }\r
+}
+
+void\r
+ImageFileView::OnInvertValues (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ rIF.invertPixelValues (rIF);\r
+ rIF.labelAdd ("Invert Pixel Values");\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+}\r
+\r
+void\r
+ImageFileView::OnSquare (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ rIF.square (rIF);\r
+ rIF.labelAdd ("Square Pixel Values");\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+}\r
+\r
+void\r
+ImageFileView::OnSquareRoot (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ rIF.sqrt (rIF);\r
+ rIF.labelAdd ("Square-root Pixel Values");\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+}\r
+\r
+void\r
+ImageFileView::OnLog (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ rIF.log (rIF);\r
+ rIF.labelAdd ("Logrithm base-e Pixel Values");\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+}\r
+\r
+void\r
+ImageFileView::OnExp (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ rIF.exp (rIF);\r
+ rIF.labelAdd ("Exponent base-e Pixel Values");\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+}\r
+\r
+void\r
+ImageFileView::OnAdd (wxCommandEvent& event)\r
+{\r
+ std::vector<ImageFileDocument*> vecIF;\r
+ theApp->getCompatibleImages (GetDocument(), vecIF);\r
+ \r
+ if (vecIF.size() == 0) {\r
+ wxMessageBox ("There are no compatible image files open for comparision", "No comparison images");\r
+ } else {\r
+ DialogGetComparisonImage dialogGetCompare (m_frame, "Get Image to Add", vecIF, false);\r
+ \r
+ if (dialogGetCompare.ShowModal() == wxID_OK) {\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ ImageFileDocument* pRHSDoc = dialogGetCompare.getImageFileDocument();\r
+ const ImageFile& rRHSIF = pRHSDoc->getImageFile();\r
+ ImageFileDocument* pNewDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));\r
+ if (! pNewDoc) {\r
+ sys_error (ERR_SEVERE, "Unable to create image file");\r
+ return;\r
+ }\r
+ ImageFile& newImage = pNewDoc->getImageFile(); \r
+ newImage.setArraySize (rIF.nx(), rIF.ny());\r
+ rIF.addImages (rRHSIF, newImage);\r
+ std::ostringstream os;\r
+ os << "Add image " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() << " and " \r
+ << pRHSDoc->GetFirstView()->GetFrame()->GetTitle().c_str();\r
+ wxString s = GetDocument()->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rIF, s.c_str());\r
+ s = pRHSDoc->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rRHSIF, s.c_str());\r
+ newImage.labelAdd (os.str().c_str());\r
+ *theApp->getLog() << os.str().c_str() << "\n";\r
+ if (theApp->getSetModifyNewDocs())\r
+ pNewDoc->Modify(TRUE);\r
+ pNewDoc->UpdateAllViews(this);\r
+ pNewDoc->GetFirstView()->OnUpdate (this, NULL);\r
+ }\r
+ }\r
+}\r
+\r
+void\r
+ImageFileView::OnSubtract (wxCommandEvent& event)\r
+{\r
+ std::vector<ImageFileDocument*> vecIF;\r
+ theApp->getCompatibleImages (GetDocument(), vecIF);\r
+ \r
+ if (vecIF.size() == 0) {\r
+ wxMessageBox ("There are no compatible image files open for comparision", "No comparison images");\r
+ } else {\r
+ DialogGetComparisonImage dialogGetCompare (m_frame, "Get Image to Subtract", vecIF, false);\r
+ \r
+ if (dialogGetCompare.ShowModal() == wxID_OK) {\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ ImageFileDocument* pRHSDoc = dialogGetCompare.getImageFileDocument();\r
+ const ImageFile& rRHSIF = pRHSDoc->getImageFile();\r
+ ImageFileDocument* pNewDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));\r
+ if (! pNewDoc) {\r
+ sys_error (ERR_SEVERE, "Unable to create image file");\r
+ return;\r
+ }\r
+ ImageFile& newImage = pNewDoc->getImageFile(); \r
+ newImage.setArraySize (rIF.nx(), rIF.ny());\r
+ rIF.subtractImages (rRHSIF, newImage);\r
+ std::ostringstream os;\r
+ os << "Subtract image " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() << " and " \r
+ << pRHSDoc->GetFirstView()->GetFrame()->GetTitle().c_str();\r
+ wxString s = GetDocument()->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rIF, s.c_str());\r
+ s = pRHSDoc->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rRHSIF, s.c_str());\r
+ newImage.labelAdd (os.str().c_str());\r
+ *theApp->getLog() << os.str().c_str() << "\n";\r
+ if (theApp->getSetModifyNewDocs())\r
+ pNewDoc->Modify(TRUE);\r
+ pNewDoc->UpdateAllViews(this);\r
+ pNewDoc->GetFirstView()->OnUpdate (this, NULL);\r
+ }\r
+ }\r
+}\r
+\r
+void\r
+ImageFileView::OnMultiply (wxCommandEvent& event)\r
+{\r
+ std::vector<ImageFileDocument*> vecIF;\r
+ theApp->getCompatibleImages (GetDocument(), vecIF);\r
+ \r
+ if (vecIF.size() == 0) {\r
+ wxMessageBox ("There are no compatible image files open for comparision", "No comparison images");\r
+ } else {\r
+ DialogGetComparisonImage dialogGetCompare (m_frame, "Get Image to Multiply", vecIF, false);\r
+ \r
+ if (dialogGetCompare.ShowModal() == wxID_OK) {\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ ImageFileDocument* pRHSDoc = dialogGetCompare.getImageFileDocument();\r
+ const ImageFile& rRHSIF = pRHSDoc->getImageFile();\r
+ ImageFileDocument* pNewDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));\r
+ if (! pNewDoc) {\r
+ sys_error (ERR_SEVERE, "Unable to create image file");\r
+ return;\r
+ }\r
+ ImageFile& newImage = pNewDoc->getImageFile(); \r
+ newImage.setArraySize (rIF.nx(), rIF.ny());\r
+ rIF.multiplyImages (rRHSIF, newImage);\r
+ std::ostringstream os;\r
+ os << "Multiply image " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() << " and " \r
+ << pRHSDoc->GetFirstView()->GetFrame()->GetTitle().c_str();\r
+ wxString s = GetDocument()->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rIF, s.c_str());\r
+ s = pRHSDoc->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rRHSIF, s.c_str());\r
+ newImage.labelAdd (os.str().c_str());\r
+ *theApp->getLog() << os.str().c_str() << "\n";\r
+ if (theApp->getSetModifyNewDocs())\r
+ pNewDoc->Modify(TRUE);\r
+ pNewDoc->UpdateAllViews(this);\r
+ pNewDoc->GetFirstView()->OnUpdate (this, NULL);\r
+ }\r
+ }\r
+}\r
+\r
+void\r
+ImageFileView::OnDivide (wxCommandEvent& event)\r
+{\r
+ std::vector<ImageFileDocument*> vecIF;\r
+ theApp->getCompatibleImages (GetDocument(), vecIF);\r
+ \r
+ if (vecIF.size() == 0) {\r
+ wxMessageBox ("There are no compatible image files open for comparision", "No comparison images");\r
+ } else {\r
+ DialogGetComparisonImage dialogGetCompare (m_frame, "Get Image to Divide", vecIF, false);\r
+ \r
+ if (dialogGetCompare.ShowModal() == wxID_OK) {\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ ImageFileDocument* pRHSDoc = dialogGetCompare.getImageFileDocument();\r
+ const ImageFile& rRHSIF = pRHSDoc->getImageFile();\r
+ ImageFileDocument* pNewDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));\r
+ if (! pNewDoc) {\r
+ sys_error (ERR_SEVERE, "Unable to create image file");\r
+ return;\r
+ }\r
+ ImageFile& newImage = pNewDoc->getImageFile(); \r
+ newImage.setArraySize (rIF.nx(), rIF.ny());\r
+ rIF.divideImages (rRHSIF, newImage);\r
+ std::ostringstream os;\r
+ os << "Divide image " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() << " by " \r
+ << pRHSDoc->GetFirstView()->GetFrame()->GetTitle().c_str();\r
+ wxString s = GetDocument()->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rIF, s.c_str());\r
+ s = pRHSDoc->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rRHSIF, s.c_str());\r
+ newImage.labelAdd (os.str().c_str());\r
+ *theApp->getLog() << os.str().c_str() << "\n";\r
+ if (theApp->getSetModifyNewDocs())\r
+ pNewDoc->Modify(TRUE);\r
+ pNewDoc->UpdateAllViews(this);\r
+ pNewDoc->GetFirstView()->OnUpdate (this, NULL);\r
+ }\r
+ }\r
+}\r
+\r
+\r
+#ifdef HAVE_FFTW\r
+void\r
+ImageFileView::OnFFT (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ wxProgressDialog dlgProgress (wxString("FFT"), wxString("FFT Progress"), 1, m_frame, wxPD_APP_MODAL);\r
+ rIF.fft (rIF);\r
+ rIF.labelAdd ("FFT Image");\r
+ m_bMinSpecified = false;\r
+ m_bMaxSpecified = false;\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+}\r
+\r
+void\r
+ImageFileView::OnIFFT (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ wxProgressDialog dlgProgress (wxString("IFFT"), wxString("IFFT Progress"), 1, m_frame, wxPD_APP_MODAL);\r
+ rIF.ifft (rIF);\r
+ rIF.labelAdd ("IFFT Image");\r
+ m_bMinSpecified = false;\r
+ m_bMaxSpecified = false;\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+}\r
+#endif\r
+\r
+void\r
+ImageFileView::OnFourier (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ wxProgressDialog dlgProgress (wxString("Fourier"), wxString("Fourier Progress"), 1, m_frame, wxPD_APP_MODAL);\r
+ rIF.fourier (rIF);\r
+ rIF.labelAdd ("Fourier Image");\r
+ m_bMinSpecified = false;\r
+ m_bMaxSpecified = false;\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+}\r
+void\r
+ImageFileView::OnInverseFourier (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ wxProgressDialog dlgProgress (wxString("Inverse Fourier"), wxString("Inverse Fourier Progress"), 1, m_frame, wxPD_APP_MODAL);\r
+ rIF.inverseFourier (rIF);\r
+ rIF.labelAdd ("Inverse Fourier Image");\r
+ m_bMinSpecified = false;\r
+ m_bMaxSpecified = false;\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+}\r
+\r
+void\r
+ImageFileView::OnShuffleNaturalToFourierOrder (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ Fourier::shuffleNaturalToFourierOrder (rIF);\r
+ rIF.labelAdd ("Shuffle Natural To Fourier Order");\r
+ m_bMinSpecified = false;\r
+ m_bMaxSpecified = false;\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+}\r
+\r
+void\r
+ImageFileView::OnShuffleFourierToNaturalOrder (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ Fourier::shuffleFourierToNaturalOrder (rIF);\r
+ rIF.labelAdd ("Shuffle Fourier To Natural Order");\r
+ m_bMinSpecified = false;\r
+ m_bMaxSpecified = false;\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+}\r
+\r
+void\r
+ImageFileView::OnMagnitude (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ if (rIF.isComplex()) {\r
+ rIF.magnitude (rIF);\r
+ rIF.labelAdd ("Magnitude of complex-image");\r
+ m_bMinSpecified = false;\r
+ m_bMaxSpecified = false;\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+ }\r
+}\r
+\r
+void\r
+ImageFileView::OnPhase (wxCommandEvent& event)\r
+{\r
+ ImageFile& rIF = GetDocument()->getImageFile();\r
+ if (rIF.isComplex()) {\r
+ rIF.phase (rIF);\r
+ rIF.labelAdd ("Phase of complex-image");\r
+ m_bMinSpecified = false;\r
+ m_bMaxSpecified = false;\r
+ if (theApp->getSetModifyNewDocs())\r
+ GetDocument()->Modify(TRUE);\r
+ GetDocument()->UpdateAllViews(this);\r
+ }\r
+}\r
+\r
+\r