# How to implement Raw libraries in order to manipulate raw images as .NEF ?

Posted 8 years ago
12091 Views
|
15 Replies
|
2 Total Likes
|
 Dear friends,I have a lot of Raw images in .NEF format (NIKKON). So, I read the section : http://reference.wolfram.com/language/LibraryLink/tutorial/ImageProcessing.htmlBut I did not understand how implement these libraries in order to work with .NEF extension images, for astrophotography.EDIT 1: a sample of image *.NEF: https://www.dropbox.com/s/2n5y5xjhhqeh7k0/DSC_5133.NEF?dl=0
15 Replies
Sort By:
Posted 8 years ago
 But it seems correctEDIT 1: OK , I saw the above path error, I changed it, and now the following error: Out[185]= "C:\cygwin64\home\decicco\LibRaw-0.16.0\build"During evaluation of In[180]:= CreateLibrary::cmperr: Compile error: LINK : fatal error LNK1181: cannot open input file 'libraw.lib' >>Out[187]= $Failed LibraryFunction::notfound: Symbol C:\cygwin64\home\decicco\LibRaw-0.16.0\build\libraw not found. >> It is not able to find the libraw.EDIT 2.: There is no ´build directory´, and there is libraw directory. Posted 8 years ago  Ok, I tried runnig but the following error came: CreateLibrary::cmperr: Compile error: C:\Program Files\Wolfram Research\Mathematica\10.0\SystemFiles\Links\LibraryLink\LibraryResources\Source\image_external.c(4) : fatal error C1083: Cannot open include file: 'cv.h': No such file or directory >> Although the file image_external is present in the source directory:C:\Program Files\Wolfram Research\Mathematica\10.0\SystemFiles\Links\LibraryLink\LibraryResources\Source\image_externalWhat is "cv.h"? Is a header from image_external.c? Would be a bug? Posted 8 years ago  I forgot that image_external.c requires both OpenCV and LibRaw. Please replace the content of image_external.c with the following code: /* Include required header */ #include "WolframLibrary.h" #include "WolframImageLibrary.h" #include "libraw.h" /* Return the version of Library Link */ DLLEXPORT mint WolframLibrary_getVersion( ) { return WolframLibraryVersion; } /* Initialize Library */ DLLEXPORT int WolframLibrary_initialize(WolframLibraryData libData) { return LIBRARY_NO_ERROR; } /* Uninitialize Library */ DLLEXPORT void WolframLibrary_uninitialize(WolframLibraryData libData) { return; } EXTERN_C DLLEXPORT int read_raw_image(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument res) { int err; int check; MImage out; char * file; libraw_data_t *iprc = libraw_init(0); libraw_processed_image_t * img; WolframImageLibrary_Functions imgFuns = libData->imageLibraryFunctions; err = LIBRARY_FUNCTION_ERROR; file = MArgument_getUTF8String(Args[0]); libraw_open_file(iprc, file); libraw_unpack(iprc); iprc->params.output_bps = 8; check = libraw_dcraw_process(iprc); if (check != LIBRAW_SUCCESS) goto cleanup; img = libraw_dcraw_make_mem_image(iprc, &check); if (img == NULL) goto cleanup; if (img->type != LIBRAW_IMAGE_BITMAP || img->colors != 3) goto cleanup; if (img->bits == 16) { raw_t_ubit16 * raw_data = (raw_t_ubit16*)img->data; imgFuns->MImage_new2D(img->width, img->height, 3, MImage_Type_Bit16, MImage_CS_RGB, 1, &out); memcpy(imgFuns->MImage_getBit16Data(out), raw_data, img->width * img->height * 3 * sizeof(raw_t_ubit16)); } else if (img->bits == 8) { raw_t_ubit8 * raw_data = (raw_t_ubit8*)img->data; imgFuns->MImage_new2D(img->width, img->height, 3, MImage_Type_Bit8, MImage_CS_RGB, 1, &out); memcpy(imgFuns->MImage_getByteData(out), raw_data, img->width * img->height * 3 * sizeof(raw_t_ubit8)); } else { goto cleanup; } MArgument_setMImage(res, out); err = LIBRARY_NO_ERROR; cleanup: libData->UTF8String_disown(file); libraw_dcraw_clear_mem(img); return err; }  Posted 8 years ago  Hi, Piotr!Well I did , but now the following error happened: During evaluation of In[162]:= CreateLibrary::cmperr: Compile error: C:\Program Files\Wolfram Research\Mathematica\10.0\SystemFiles\Links\LibraryLink\LibraryResources\Source\image_external.c(5) : fatal error C1083: Cannot open include file: 'libraw.h': No such file or directory >>Out[169]=$FailedDuring evaluation of In[162]:= LibraryFunction::notfound: Symbol C:\cygwin64\home\decicco\LibRaw-0.16.0\libraw\build\libraw not found. But ´libraw.h´ is there: C:\cygwin64\home\decicco\LibRaw-0.16.0\libraw\libraw.h
Posted 8 years ago
 Marcelo, your include path and library path are incorrect. You need to set them correctly.
Posted 8 years ago
 I compiled and installed the Libraw files using cygwin in Windows environment using the instructions in: LibRaw installYou mentioned compiling also : ".... imageexternal.c, load the LibRaw library and load the readraw_image function...";Will Mathematica performance this for (or I have call cygwin again)?
Posted 8 years ago
Posted 8 years ago
 ok!Thanks!
Posted 8 years ago
 Dear Marcelo,You need to download the source code of LibRaw library: http://www.libraw.org/download#stable and build it. Then, you need to compile image_external.c, load the LibRaw library and load the read_raw_image function. Here is an example for Windows: Needs["LibraryLink"] Needs["CCompilerDriver"] sourcePath="c:\\Program Files\\Wolfram Research\\Mathematica\\10.0\SystemFiles\\Links\\LibraryLink\\LibraryResources\\Source"; librawDir="c:\\libraw"; librawIncludeDir=FileNameJoin[{librawDir,"libraw"}]; librawLibDir=FileNameJoin[{librawDir,"build"}]; librawLibraries={"libraw"}; (*Compile "image_external.c*) lib=CreateLibrary[{FileNameJoin[{sourcePath,"image_external.c"}]},"image_external","IncludeDirectories"->librawIncludeDir,"LibraryDirectories"->librawLibDir,"Libraries"->librawLibraries,"Defines"->"WIN32"]; (*Load LibRaw*) LibraryLoad[FileNameJoin[{librawLibDir,"libraw"}]]; (*Load read_raw_image*) readRawImage = LibraryFunctionLoad[lib, "read_raw_image", {{"UTF8String"}}, LibraryDataType[Image]] Finally, you can import raw images by calling: readRawImage[pathToRawFile] 
Posted 8 years ago
 So if we want use the raw image, first it is more useful do the reductions (darks, bias, flats, etc..) in a suitable program and then converting the results to a suited format for being manipulate inside mathematica.
Posted 8 years ago
 I really don't know much about astrophotography, but don't modern Nikon cameras do in-camera dark-frame subtraction already? The camera calls it "long exposure noise reduction".If you'd want to turn this off in camera and do it manually, then the dcraw based method I suggested does really give you data which is suitable for this. dcraw -o 0 -D -T -6 infile.nef `will create a TIFF that has un-demosaiced, unprocessed data. The pixel values will be proportional to the charge accumulated at each photosite. The TIFF you get will look like this (no. 2) due to lack of demosaicing. You can then process it in Mathematica.But I imagine that eventually you would want to export this data from Mathematica and do proper demosaicing on it. I don't know what tool will be able to do this well. I don't know of any easy way to put the processed data back into a NEF file so you can use Lightroom, ViewNX or other RAW converters that know the camera's characteristics and can do a correct conversion.This is why I stopped playing with RAW data in Mathematica. I could do some useful processing on it (I wanted to do de-banding), but I had no way to convert this data to a usable photograph afterwards.
Posted 8 years ago
 Hi David,In fact, I use raw images to do the following corrections: Dark frames and bias, mainly, so I can correct the termal noise from ccd,and other distorsions as vigneting etc...I do not ever try using tiff format. I ll try the Szlabocs suggestions.Before using photoshop , or ligthroom I would like to clean the image using mathematica codes applied for these darks and bias reductions. So we need the crude informations from sensors to do that. My intend is explore the Mathematica programming in the same path that sherlock´s http://blog.wolfram.com/2014/08/14/fixing-bad-astrophotography-ii-imaging-mars-with-mathematica/ did (with. fits extension), but using dark and bias reductions first and then aplying other filtering codes..
Posted 8 years ago
 Hi Marcelo, I do a lot of photography with a Nikon camera. The raw NEF images are exactly what is read from the imager. That means they lack even the color correction needed to compensate for the spectral response of the imager. I am doing photography -- not data analysis -- but I convert images by reading them into Adobe LightRoom, often to jpeg for printing, but sometimes to tiff. Adobe Camera Raw and Photoshop will also read raw images and convert them as needed. I think your best solution (as someone on StackExchage also recommended) is to read your images with such a tool and covert to tiff. This avoids the artifacts of jpeg compression, but can correct for color as needed. If you have in fact calibrated for the spectral response of the camera imager you could probably also create a tiff with no color correction, only the pixel values in tiff format so Mathematica can read them. If that is what you need, let me know and I'll look into it.Kind regards, David
Posted 8 years ago