我正在使用 CVI 做我的最终项目,但我遇到了一些问题。该项目一般是在图像上应用FFT,在四个级别(通道)添加高斯白噪声,应用IFFT来恢复原始图像。我有两个部分:
- 我可以对行和列使用 2DFFT 或 1DFFT
- 我必须对行和列使用 1DFFT,并将信号通过滤波器 2D-DWT
现在我用一个名为 bitmapID 的指针保存图像数据,该指针只能用于某些功能。我想将图像数据保存为一个数组,以便我更容易访问它并进行操作。我尝试使用函数 ImaqImageToArray,但我不知道它为什么不起作用(与图像尺寸有关的东西)
我想得到一些帮助提前谢谢
这是我一直在尝试的一些事情:
#include "nivision.h"
#include <advanlys.h>
#include <formatio.h>
#include <ansi_c.h>
#include <cvirte.h>
#include <userint.h>
#include "Project.h"
static int __F_boGet_And_Display_User_Image(void)
{
char FileName[260];
int status;
AnalysisLibErrType analysisErr;
//int fit_mode;
//prompt user to select file
status = FileSelectPopup ("", "*.jpg", "", "", VAL_LOAD_BUTTON, 0, 0, 1, 1, FileName);
if(status == VAL_NO_FILE_SELECTED)
return(FALSE);
//-------------------------------------------------------------------------
//get image bitmap id
status = GetBitmapFromFile (FileName, &bmpHandler);
if(status != UIENoError)
{
__F_voError("Failed to get image file bitmap" , FileName);
return(FALSE);
}
//display image on panel
FitModeControl_Callbak(panelHandle,PANEL_CHECKBOX_FIT_MODE,EVENT_COMMIT,NULL,0,0);
DisplayImageFile(panelHandle,PANEL_PICTURE_ORIGINAL,FileName);
//-------------------------------------------------------------------------
//get bitmap dimensions
status = GetBitmapData (bmpHandler, &ByteInRow, &Pixel, &pWidth, &pHeight, NULL, NULL, NULL);
if(status != UIENoError)
{
__F_voError("Failed to get bitmap dimensions" , FileName);
__F_voFree_Resources(&bmpHandler , &outBitmap , &MyPicData);
return(FALSE);
}
//-------------------------------------------------------------------------
//memory allocation
BitSize = pWidth * pHeight * (Pixel/8) *2;
MyPicData = (unsigned char*) malloc(BitSize);
if(MyPicData == NULL)
{
__F_voError("Failed to allocate memory" , FileName);
__F_voFree_Resources(&bmpHandler , &outBitmap , &MyPicData);
return(FALSE);
}
//get bitmap info + dimensions
status = GetBitmapData (bmpHandler, &ByteInRow, &Pixel, &pWidth, &pHeight, NULL, MyPicData, NULL);
if(status != UIENoError)
{
__F_voError("Failed to get bitmap info" , FileName);
__F_voFree_Resources(&bmpHandler , &outBitmap , &MyPicData);
return(FALSE);
}
//get image to a 2D-array
int pWidthArr, pHeightArr;
double ArrFromImage[][];
ArrFromImage = imaqImageToArray (MyPicData, IMAQ_NO_RECT, &pWidthArr, &pHeightArr);
if(ArrFromImage == NULL)
{
__F_voError("Failed to get 2D-array from image" , FileName);
imaqDispose(ArrFromImage);
return(FALSE);
}
//-------------------------------------------------------------------------
//fourier transform
//=================
double fftOut[pHeight][pWidth * 2];
analysisErr = FFT2D(bits,
pHeight, //NUM_ROWS,
pWidth, //NUM_COLS,
pHeight, //NUM_ROWS,
pWidth, //NUM_COLS,
0,
fftOut);
if(analysisErr != NoAnlysErr)
{
__F_voError("Failed to perform fourier transform" , FileName);
__F_voFree_Resources(&bmpHandler , &outBitmap , &MyPicData);
return(FALSE);
}
//-------------------------------------------------------------------------
//inverse fourier transform
//=========================
double fftInv[pHeight][pWidth * 2];
analysisErr = InvFFT2D(fftOut, //void *frequencyDomainSignal,
pHeight, //ssize_t numberOfRows,
pWidth, //ssize_t numberOfColumns,
0, //int shifted,
fftInv); //void *fft);
if(analysisErr != NoAnlysErr)
{
__F_voError("Failed to perform inverse fourier transform" , FileName);
__F_voFree_Resources(&bmpHandler , &outBitmap , &MyPicData);
return(FALSE);
}