Обработка изображений CVI с использованием БПФ и библиотеки анализа - PullRequest
1 голос
/ 11 июля 2020

Я делаю свой последний проект, используя CVI, и у меня есть некоторые проблемы. в целом проект заключается в применении БПФ к изображению, добавлении белого гауссовского шума на четырех уровнях (канале), применении БПФ для восстановления исходного изображения. у меня две части:

  1. я могу использовать 2DFFT или 1DFFT для строк и столбцов
  2. я должен использовать 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);
    }
...