Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenCV imwrite saving complete black jpeg

I have done some pre processing for dft , and i am trying to save this image by imwrite.

My cropped image has this information

output.type()           5   

output.channels()       1

output.depth()          5

But everytime when i save it gives black output. I have checked old existing threads of stackoverflow but all seems not working for me. e.g. OpenCV2.3 imwrite saves black image

I have tried many color conversions and depth conversion as well but i dont know why it does not work.

std::vector<int> qualityType;
qualityType.push_back(CV_IMWRITE_JPEG_QUALITY);
qualityType.push_back(90);

Mat out1,out2;

cv::cvtColor(output, out1, CV_GRAY2BGR);
//out1.convertTo(out2,CV_8U,1./256); // i tried this too 
cv::imwrite("dft1.jpg",out1,qualityType); // tried even using quality type

imshow display this image fine only problem comes when i save it.

please help

[EDIT] Maybe my dft class that i made has problem because i whenever i use dft function then the output can only work with inshow but for save it does not work.

CDftRidgeAnalyses::CDftRidgeAnalyses(void)
{
}

CDftRidgeAnalyses::~CDftRidgeAnalyses(void)
{
}


Mat CDftRidgeAnalyses::GetRidgeAnalyses(Mat inpGray)
{
    Mat img = inpGray;
    int WidthPadded=0,HeightPadded=0;
    WidthPadded=img.cols*2;
    HeightPadded=img.rows*2;
    int M = getOptimalDFTSize( img.rows );
    //Create a Gaussian Highpass filter 5% the height of the Fourier transform
    double db  = 0.05 * HeightPadded;

    Mat fft = ForierTransform(img.clone(),HeightPadded,WidthPadded);

    Mat ghpf = CreateGaussianHighPassFilter(Size(WidthPadded, HeightPadded), db);
    Mat res;

    cv::mulSpectrums(fft,ghpf,res,DFT_COMPLEX_OUTPUT);

    Mat mag  = GetDftToImage(res,img);

    int cx = mag.cols/2;
    int cy = mag.rows/2;
    cv::Mat croped = mag(cv::Rect(0,0,cx, cy));

    cv::threshold(mag, mag, 0.019, 1, cv::THRESH_BINARY);

    Mat bgr;
    cvtColor(mag,bgr,CV_GRAY2RGB);

    //imshow("XXX",bgr);
    //imshow("croped", croped);
    //imshow("img",img);
    //
    //cv::waitKey();
    return croped;
}




Mat CDftRidgeAnalyses::ForierTransform(Mat inpGray,int M,int N)
{
    Mat img = inpGray;
    int i = img.channels();

    Mat padded;
    Mat img2;
    img.convertTo(img2,CV_64F,1./255);

    copyMakeBorder(img2, padded, 0, M - img2.rows, 0, N - img2.cols, BORDER_CONSTANT, Scalar::all(0));

    Mat element1 = Mat_<float>(padded);
    Mat element2 = Mat::zeros(padded.size(), CV_32F);
    Mat planes[] = {element1, element2};
    Mat complexImg;

    merge(planes, 2, complexImg);

    dft(complexImg, complexImg ,0, img.rows);

    //printMat(complexImg);

    return complexImg;
}



double CDftRidgeAnalyses::pixelDistance(double u, double v)
{
    return cv::sqrt(u*u + v*v);
}

double CDftRidgeAnalyses::gaussianCoeff(double u, double v, double d0)
{
    double d = pixelDistance(u, v);
    return 1.0 - cv::exp((-d*d) / (2*d0*d0));
}

cv::Mat CDftRidgeAnalyses::CreateGaussianHighPassFilter(cv::Size size, double cutoffInPixels)
{
    Mat ghpf(size, CV_32F);

    cv::Point center2((size.width*0.80), size.width/2);
    //cv::Point center2(0,0);

    for(int u = 0; u < ghpf.rows; u++)
    {
        for(int v = 0; v < ghpf.cols; v++)
        {
            ghpf.at<float>(u, v) = gaussianCoeff(u - center2.x, v - center2.y, cutoffInPixels);
        }
    }

    Mat bmp;

    int channels = ghpf.channels();
    int type = ghpf.type();
    int depth = ghpf.depth();

    cv::cvtColor(ghpf,bmp,CV_GRAY2RGB); 
    cv::cvtColor(ghpf,bmp,CV_GRAY2BGRA); 
    //imshow("XXX",bmp);
    int cx = ghpf.cols/2;
    int cy = ghpf.rows/2;
    Mat tmp;
    int iExactright =  (size.width*0.59);
    int iExactbottom = (size.height*0.86);
    //full   Mat q0(ghpf, Rect(69,10,400,290));

//  Mat whiteq(ghpf, Rect(0,390,270,330));

    int iMainleft=0, iMainright=0;
    int iMainBottom=0,iMainTop=0;


    Mat Quad;
    Mat ql(ghpf, Rect(190,0,270,330));

    /** Make the rectangle on middle default filter with respect to top right angle**/
    iMainleft=(size.width*0.111);
    iMainright=(size.width*0.402);
    iMainTop=(size.height*0.484);
    iMainBottom = (size.height*0.155);
    Quad = ghpf(Rect(iMainleft,iMainTop,iMainright+6,iMainBottom));
    Mat qTopRight(ghpf, Rect(iExactright,0, iMainright+6, iMainBottom));
    Quad.copyTo(qTopRight);

    /** Make the rectangle on middle default filter with respect to top left angle**/
    iMainright=(size.width*0.402);
    Quad = ghpf(Rect(300,iMainTop,300,iMainBottom));
    Mat qTopLeft(ghpf, Rect(0,0, 300, iMainBottom));
    Quad.copyTo(qTopLeft);


    /** Make the rectangle on middle default filter with respect to bottom left angle**/
    iMainTop = iMainTop-iMainBottom;
    iExactbottom = size.height - iMainBottom;
    Quad = ghpf(Rect(300,iMainTop,300,iMainBottom));
    Mat qBottomLeft(ghpf, Rect(0,iExactbottom, 300, iMainBottom));
    Quad.copyTo(qBottomLeft);

    /** Make the rectangle on middle default filter with respect to bottom right angle**/
    iMainleft=(size.width*0.111);
    iMainright=(size.width*0.402);

    Quad = ghpf(Rect(iMainleft,iMainTop,iMainright+6,iMainBottom));
    Mat qBottomRight(ghpf, Rect(iExactright,iExactbottom, iMainright+6, iMainBottom));
    Quad.copyTo(qBottomRight);


    // remove middle rectangle [ circle ] 
    iMainright=(size.width*0.402);
    Quad = ghpf(Rect(0,iMainTop+iMainTop,size.width,iMainBottom+iMainBottom-130));
    Mat qMiddle(ghpf,Rect(0,iMainTop+150,size.width,iMainBottom+iMainBottom-130));
    Quad.copyTo(qMiddle);
    qMiddle =ghpf(Rect(0,iMainTop-10,size.width,iMainBottom+iMainBottom-130));
    Quad.copyTo(qMiddle);

    normalize(ghpf, ghpf, 0, 1, CV_MINMAX);

    /*Mat x;
    cv::resize(ghpf,x,cv::Size(400,700));
    imshow("fftXhighpass2", x);*/
    Filter = ghpf;
    Mat padded;

    copyMakeBorder(ghpf, padded, 0, size.height - ghpf.rows, 0, size.width - ghpf.cols, BORDER_CONSTANT, Scalar::all(0));

    Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
    Mat complexImg;

    merge(planes, 2, complexImg);


    return complexImg;
}

Mat CDftRidgeAnalyses::GetDftToImage(Mat res,Mat orgImage)
{
    idft(res,res,DFT_COMPLEX_OUTPUT,orgImage.rows);

    Mat padded;
    copyMakeBorder(orgImage, padded, 0,orgImage.rows, 0, orgImage.cols, BORDER_CONSTANT, Scalar::all(0));
    Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
    split(res, planes);
    magnitude(planes[0], planes[1], planes[0]);
    Mat mag = planes[0];
    mag += Scalar::all(1);
  //  log(mag, mag);

    // crop the spectrum, if it has an odd number of rows or columns
    mag = mag(Rect(0, 0, mag.cols & -2, mag.rows & -2));

    normalize(mag, mag, 1, 0, CV_MINMAX);

    return mag;
}

The output that i am trying to save is from

Mat org = imread("4.png",CV_LOAD_IMAGE_GRAYSCALE);
Mat re;
resize(org,re,cv::Size(311,519));
Mat xyz = CDftRidgeAnalyses::GetRidgeAnalyses(re);
cv::imwrite("dft1.jpg",xyz);

here the matrix xyz has these values

output.type()           5   

output.channels()       1

output.depth()          5

I hope you guys now can help me more better... maybe after converion from complex filter i am losing some points????

like image 767
wolvorinePk Avatar asked May 13 '12 12:05

wolvorinePk


People also ask

How do you save pictures on cv2 Imwrite?

In this example, we will read an image, transform it and then save the image to persistent file storage using imwrite() method. import cv2 #read image as grey scale img = cv2. imread('D:/image-1. png') #do some transformations on img #save matrix/array as image file isWritten = cv2.

Where does cv2 Imwrite save to?

cv2. imwrite() method is used to save an image to any storage device. This will save the image according to the specified format in current working directory.

Does cv2 Imwrite overwrite?

Does cv2 Imwrite overwrite Python? imwrite will overwrite existing files without outputting an error or asking for confirmation. Image of any format can be saved using this method.

Does cv2 Imwrite compress?

This is because cv2. imwrite() has the ability to compress the image while writing it into the file.


1 Answers

A Python solution for those who come here from Google

import numpy as np
import cv2

frame_normed = 255 * (frame - frame.min()) / (frame.max() - frame.min())
frame_normed = np.array(frame_normed, np.int)

cv2.imwrite("path/to/out/file", frame_normed)
like image 198
Gulzar Avatar answered Sep 26 '22 02:09

Gulzar