Circle Detection for Fourier-Mellin Shear Estimation

My failing code snippet is the following:

    cv::normalize(cross_correlation_centered_, cross_correlation_centered_, 0,  
                  1.0, cv::NORM_MINMAX);                                        
                                                                                
    // Circles experiment:                                                      
    Timer timer;                                                                
    timer.start();                                                              
    vision::soft_threshold(cross_correlation_centered_,                         
                           cross_correlation_centered_, 0.6, 4.0);              
    cv::Mat gray;                                                               
    cv::Rect roi(cv::Point(peak.x - 50, peak.y - 50),                           
                 cv::Point(peak.x + 50, peak.y + 50));                          
    vision::convert_and_scale(cross_correlation_centered_(roi), gray, CV_8U);   
    cv::GaussianBlur(gray, gray, {3, 3}, 0.0, 0.0);                             
                                                                                
    static int index = 0;                                                       
    cv::imwrite("circles_input" + std::to_string(index++) + ".png", gray);      
                                                                                
    auto ed = cv::ximgproc::createEdgeDrawing();                                
    ed->detectEdges(gray);                                                      
    cv::Mat edges;                                                              
    ed->getEdgeImage(edges);                                                    
    cv::imshow("Edges", edges);                                                 
    std::vector<cv::Vec6d> ellipses;                                            
    ed->detectEllipses(ellipses);                                               
                                                                                
    LOG(DEBUG) << "Found " << ellipses.size() << " ellipses";                   
    for(const auto& e : ellipses) {                                            
      cv::ellipse(gray, {e[0], e[1]}, {e[2] + e[3], e[2] + e[4]}, e[5], 0,      
      360, {128}, 2, cv::LINE_AA);                                              
    }                                                                           
                                                                                
    LOG(DEBUG) << "Circles: " << timer.stop().elapsed_ms() << "ms";             
    cv::imshow("Circles", gray);

Removing unnecessary calls to cv::imshow, getEdgeImage, and cv::ellipse, etc. makes no difference.