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