@@ -29,11 +29,11 @@ cv::Mat makeMask(CircleOutline outside, CircleOutline center, cv::Mat data){
2929 int width = data.cols ;
3030 int height = data.rows ;
3131
32- double radm = outside.m_radius + 1 ; // Don't know why but +1 gives the best result match to the expected value.
32+ double radm = ceil ( outside.m_radius );
3333 double rado = center.m_radius ;
3434 double cx = outside.m_center .x ();
3535 double cy = outside.m_center .y ();
36- cv::Mat mask = cv::Mat::zeros (height,width,CV_8UC1);
36+ cv::Mat mask = cv::Mat::ones (height,width,CV_8UC1);
3737 for (int y = 0 ; y < height; ++y){
3838 for (int x = 0 ; x < width; ++x){
3939 double dx = (double )(x - (cx))/(radm);
@@ -57,13 +57,14 @@ cv::Mat makeMask(CircleOutline outside, CircleOutline center, cv::Mat data){
5757 return mask;
5858}
5959
60- DFTArea::DFTArea (QWidget *parent , IgramArea *ip, DFTTools * tools, vortexDebug *vdbug) :
61- QWidget(parent ),m_size(640 ), tools(tools),
60+ DFTArea::DFTArea (QWidget *mparent , IgramArea *ip, DFTTools * tools, vortexDebug *vdbug) :
61+ QWidget(mparent ),m_size(640 ), tools(tools),
6262 dftSizeStr(" 640 X 640" ), m_center_filter(10 .),ui(new Ui::DFTArea),igramArea(ip),m_smooth(9 .),
6363 m_vortexDebugTool(vdbug)
6464
6565{
6666 ui->setupUi (this );
67+ m_gamma = 2.5 ;
6768 connect (tools,SIGNAL (dftChannel (const QString&)), this , SLOT (setChannel (const QString&)));
6869 connect (tools,SIGNAL (dftSizeChanged (const QString&)), this , SLOT (dftSizeChanged (const QString&)));
6970 connect (tools,SIGNAL (dftSizeVal (int )), this , SLOT (dftSizeVal (int )));
@@ -155,22 +156,20 @@ Mat DFTArea::grayComplexMatfromImage(QImage &img){
155156 double centerY = igramArea->m_outside .m_center .y ();
156157 double rad = igramArea->m_outside .m_radius ;
157158 double radpix = ceil (rad);
158- double left = centerX - radpix;
159- double top = centerY - radpix;
159+ int border = 10 ;
160+ double left = floor ((centerX - radpix - border));
161+ double top = floor (centerY - radpix - border);
160162 vector<Mat > bgr_planes;
161163 top = max (top,0 .);
162164 left = max (left,0 .);
163- int width = 2 . * (radpix);
165+ int width = ceil ( 2 . * (radpix) + 2 * border );
164166 width = min (width, img.width ());
165167
166168 // new center because of crop
167169 double xCenterShift = centerX - left;
168170 double yCenterShift = centerY - top;
169171
170172 cv::Mat iMat (img.height (), img.width (), CV_8UC4, img.bits (), img.bytesPerLine ());
171- cv::Mat tmp = iMat.clone ();
172-
173-
174173 cv::Mat roi = iMat (cv::Rect ((int )left,(int )top,(int )width,(int )width)).clone ();
175174
176175 double centerDx = centerX - igramArea->m_center .m_center .x ();
@@ -187,7 +186,7 @@ Mat DFTArea::grayComplexMatfromImage(QImage &img){
187186 if (scaleFactor < 1 .){
188187
189188 cv::resize (roi,roi, cv::Size (0 ,0 ), scaleFactor, scaleFactor);
190- double roic = roi.rows /2 .;
189+ double roic = ( roi.rows - 1 ) /2 .;
191190 m_outside = CircleOutline (QPointF (roic,roic),roic);
192191 m_center = CircleOutline (QPointF ((roic - centerDx * scaleFactor), (roic - centerDy * scaleFactor)),
193192 m_center.m_radius * scaleFactor);
@@ -205,6 +204,7 @@ Mat DFTArea::grayComplexMatfromImage(QImage &img){
205204
206205 split ( roi, bgr_planes );
207206
207+
208208 cv::Scalar mean;
209209 mean = cv::mean (roi);
210210 double maxMean = 0 ;
@@ -224,32 +224,47 @@ Mat DFTArea::grayComplexMatfromImage(QImage &img){
224224 else if (channel == " Green" ) maxndx = 1 ;
225225 else if (channel == " Red" ) maxndx = 2 ;
226226 qDebug () << " Max channel " << maxndx;
227+ Mat padded = bgr_planes[maxndx].clone ();
227228
228- Mat padded; // expand input image to optimal size
229229 int m = getOptimalDFTSize ( roi.rows ) - roi.rows ;
230230 int n = getOptimalDFTSize ( roi.cols ) - roi.cols ; // on the border add zero values
231- m =0 ;
231+ // disabled adding optomizing DFT boarder.
232+ m = 0 ;
232233 n = 0 ;
233234 qDebug () << " pady " << m << " padx " << n;
234235 if (m > 0 || n > 0 )
235- copyMakeBorder (bgr_planes[maxndx], padded, 0 , m, 0 , n, BORDER_CONSTANT, Scalar::all (0 ));
236- else
237- padded = bgr_planes[maxndx].clone ();
236+ copyMakeBorder (padded, padded, 0 , m, 0 , n, BORDER_CONSTANT, Scalar::all (mean[maxndx]));
237+
238238 padded = padded - mean[maxndx];
239- // disabled adding optomizing DFT boarder.
239+
240240 Mat planes[] = {Mat_<float >(padded), Mat::zeros (padded.size (), CV_32F)};
241241
242- m_mask = makeMask (m_outside,m_center,*planes);
243- if (Settings2::showMask ())
244- showData (" Mask" , m_mask);
242+ m_mask = makeMask (m_outside,m_center, *planes);
243+ if (Settings2::showMask ()){
244+ Mat tmp = planes[0 ].clone ();
245+ normalize (tmp, tmp,0 ,255 ,CV_MINMAX);
246+ tmp.convertTo (tmp,CV_8U);
247+ Mat mm;
248+ Mat channels[3 ];
249+
250+ channels[1 ] = m_mask;
251+ channels[2 ] = tmp;
252+ channels[0 ] = m_mask;
253+ merge (channels,3 ,mm);
254+ for (int i = 0 ; i < 3 ; ++i){
255+ // imshow(QString().number(i).toStdString().c_str(),channels[i]);
256+ }
257+ imshow (" mm" , mm);
258+ waitKey (1 );
259+
260+ }
245261 cv::Mat tmpMask;
246262
247263 planes[0 ].copyTo (tmpMask,m_mask); // Convert image to binary
248264 planes[0 ] = tmpMask.clone ();
249265 mean = cv::mean (planes[0 ],m_mask);
250266 planes[0 ] -= mean;
251- // matDisplay md(planes[0],mean[0]);
252- // md.exec();
267+
253268 Mat complexI;
254269 merge (planes, 2 , complexI); // Add to the expanded another plane with zeros
255270 return complexI;
@@ -346,26 +361,40 @@ void DFTArea::doDFT(){
346361 cv::Mat realImage;
347362 dft (complexI,realImage,DFT_INVERSE);
348363 split (realImage,planes);
349- // cv::imshow("Inverse", planes[0]/(planes[0].cols * planes[0].rows));
350- // cv::waitKey(1);
364+
351365 shiftDFT (complexI);
352366 m_dft = complexI/complexI.size ().area ();
353367
354- magIImage = showMag (complexI);
368+ magIImage = showMag (complexI,false ," " , true , m_gamma);
369+ scale = 1 .;
370+ double h = magIImage.height ();
371+ qDebug () <<" dft size " << size ();
372+ scale = double (parentWidget ()->size ().height ())/h;
373+ if (scale < 1 .)
374+ scale = 1 .;
375+ magIImage = magIImage.scaled (magIImage.width () * scale, magIImage.height () * scale);
376+ setMinimumSize (magIImage.size ());
355377
356378 // emit selectDFTTab();
357379 update ();
358380 if (Settings2::showDFT ())
359381 emit dftReady (magIImage); // Creates a thumbnail dft area
360382}
383+ void DFTArea::gamma (int i){
384+ double v = 1 . + 5 . * (double )i/99 .;
385+ m_gamma = v;
386+ doDFT ();
387+ }
388+
361389void DFTArea::paintEvent (QPaintEvent *)
362390{
363391 QPainter painter (this );
364392 painter.drawImage (QPoint (0 ,0 ),magIImage);
365393 painter.setBrush (QColor (0 ,0 ,100 ,50 ));
366- painter.drawEllipse (QPointF (magIImage.width ()/2 ,magIImage.height ()/2 ), m_center_filter,m_center_filter);
394+ painter.drawEllipse (QPointF (magIImage.width ()/2 ,magIImage.height ()/2 ),
395+ scale * m_center_filter,scale * m_center_filter);
367396 if (m_center_filter > 0 .) {
368- double val = (double )m_center_filter;
397+ double val = (double )m_center_filter * scale ;
369398 val *= val;
370399 int last = 0 ;
371400 for (int i = 0 ; i < magIImage.width ()-1 ; ++i){
@@ -379,13 +408,7 @@ void DFTArea::paintEvent(QPaintEvent *)
379408 }
380409 }
381410}
382- void DFTArea::resizeIgram (){
383-
384- }
385411
386- void DFTArea::setFilter (double ){
387-
388- }
389412
390413#define WRAP (x ) (((x) > 0.5 ) ? ((x)-1.0 ) : (((x) <= -0.5 ) ? ((x)+1.0 ) : (x)))
391414#define WRAPPI (x ) (((x) > M_PI) ? ((x)-2 *M_PI) : (((x) <= -M_PI) ? ((x)+2 *M_PI) : (x)))
@@ -802,8 +825,8 @@ void DFTArea::makeSurface(){
802825 phase.size ().width , phase.size ().height );
803826
804827 flip (result,result,0 ); // flip around x axis.
805- m_outside.m_center .ry () = wy - m_outside.m_center .y () - 1 ;
806- m_center.m_center .ry () = wy - m_center.m_center .y () - 1 ;
828+ m_outside.m_center .ry () = result. rows - m_outside.m_center .y ();
829+ m_center.m_center .ry () = result. rows - m_center.m_center .y ();
807830 mirrorDlg *md = mirrorDlg::get_Instance ();
808831 if (md->fringeSpacing != 1 .){
809832 result *= md->fringeSpacing ;
@@ -832,7 +855,7 @@ void DFTArea::mouseMoveEvent(QMouseEvent *event){
832855 int xcenter = (magIImage.width () -1 )/2 ;
833856 int ycenter = (magIImage.height ()-1 )/2 ;
834857 int rad = sqrt (pow (pos.x ()-xcenter,2 )+pow (pos.y () - ycenter,2 ));
835- emit updateFilterSize (rad);
858+ emit updateFilterSize (rad/scale );
836859}
837860
838861void DFTArea::mousePressEvent (QMouseEvent *event)
@@ -844,7 +867,7 @@ void DFTArea::mousePressEvent(QMouseEvent *event)
844867 int ycenter = (magIImage.height ()-1 )/2 ;
845868 int rad = sqrt (pow (Raw.x ()-xcenter,2 )+pow (Raw.y () - ycenter,2 ));
846869
847- emit updateFilterSize (rad);
870+ emit updateFilterSize (rad/scale );
848871 capture = true ;
849872 }
850873
0 commit comments