簡體   English   中英

用C語言讀取和顯示灰度圖像。

[英]Read and display gray scale images in C language.

我想在C中加載灰度圖像,對其進行預處理,然后顯示修改后的圖像。 我的問題是:

用C語言導入灰度圖像(jpeg,png格式)的正確方法是什么?

在問這個問題之前,我自己進行了搜索。

1- fread或使用文件管理,我們可以讀取圖像,但是數據將被加密(壓縮),我想要每個像素的灰度值(0-255)。

2-有一個API ImageMagick可能會有所幫助,但Mac OS X存在安裝問題。

我已經在python和matlab中完成了圖像處理,但是對C語言一無所知。

謝謝

您有很多選擇,但我將首先從與OSX的最簡單和最少的集成開始,然后逐步與OSX進行更多的集成。

最簡單的選擇

就個人而言,如果我打算處理灰度圖像,我會編寫軟件以使用NetPBM的可移植灰度圖(PGM)格式,因為它是最簡單的讀寫方式,並且很容易與其他格式互換。 沒有壓縮,DCT,量化,色彩空間,EXIF數據-只是帶有簡單標頭的數據。 文檔在這里

基本上,PGM文件如下所示:

在此處輸入圖片說明

P2
# Shows the word "FEEP" (example from Netpbm man page on PGM)
24 7
15
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
0  3  3  3  3  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0 15  0
0  3  3  3  0  0  0  7  7  7  0  0  0 11 11 11  0  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0  0  0
0  3  0  0  0  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15  0  0  0  0
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

您可以看到P2表示為ASCII(易於閱讀)和灰度圖。 然后下一行說它是24像素寬乘以7高,而最亮的像素是15。讀取和寫入非常簡單。 您可以將P2更改為P5 ,並將MAXVAL之后的所有內容寫入二進制文件以節省空間。

現在,您只需在程序外部使用ImageMagick即可將JPEG,PNG,GIF,TIFF文件轉換為PGM,就像這樣-無需任何鏈接,庫或編譯器開關:

convert input.png output.pgm

convert input.jpg output.pgm

同樣,在完成處理並以PGM格式創建結果輸出文件后,您只需簡單地反轉參數即可將其轉換為JPEG或TIFF:

convert result.pgm result.jpg

就個人而言,我將使用homebrew安裝ImageMagick。 您可以訪問homebrew網站並復制單行代碼並將其粘貼到終端中以安裝homebrew 然后,您可以使用以下命令安裝ImageMagick:

brew install imagemagick

順便說一句,如果您想在這里嘗試其他建議(使用OpenCV),那么就像

brew search opencv
brew install homebrew/science/opencv

如果您想獲得一個小的OpenCV項目的獨立示例,請在這里查看我對另一個問題的回答-您還可以在我的其他答案中 ,通過ImageMagick在命令行中查看像這樣的項目如何實現同樣的問題。

Magick ++

如果選擇使用homebrew安裝ImageMagick,則將獲得Magick ++,它將允許您使用C和C ++編寫算法。 它非常易於使用,並且可以在包括OSX,Windows和Linux在內的任何平台上運行,因此從該角度來看很有吸引力。 它還具有內置了許多,許多圖像處理功能。這是一個很好的教程在這里 ,和文檔在這里

您的代碼將如下所示:

// Read an image from URL
Image url_image("http://www.serverName.com/image.gif");

// Read image from local filesystem
Image local_file_image("my_image.gif"); 

// Modify image
Pixels my_pixel_cache(my_image);
PixelPacket* pixels;
// define the view area that will be accessed via the image pixel cache
int start_x = 10, start_y = 20, size_x = 200, size_y = 100;
// return a pointer to the pixels of the defined pixel cache
pixels = my_pixel_cache.get(start_x, start_y, size_x, size_y);

// set the color of the first pixel from the pixel cache to black (x=10, y=20 on my_image) 
*pixels = Color("black");

// set to green the pixel 200 from the pixel cache:
// this pixel is located at x=0, y=1 in the pixel cache (x=10, y=21 on my_image) 
*(pixels+200) = Color("green");

// now that the operations on my_pixel_cache have been finalized
// ensure that the pixel cache is transferred back to my_image
my_pixel_cache.sync();

// Save results as BMP file
image.write(“result.bmp”);

Apple OSX選件

另一個“完全分開”的選項是使用Apple提供的用於處理圖像的工具-它們既快速又易於使用,但不適用於Linux或Windows。 因此,例如,如果您想

a)加載PNG文件(或TIFF或JPEG,只需更改擴展名)

b)將其另存為JPEG文件

c)處理單個像素

// Load a PNG file
NSImage * strImage = [[NSImage alloc]initWithContentsOfFile:@"/Users/mark/Desktop/input.png"];

// Save NSImage as JPG
NSData *imageData = [strImage TIFFRepresentation];
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];
NSDictionary *imageProps = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:1.0] forKey:NSImageCompressionFactor];
imageData = [imageRep representationUsingType:NSJPEGFileType properties:imageProps];
[imageData writeToFile:@"/Users/Mark/Desktop/result.jpg" atomically:YES];

// Access individual pixels
int w=imageRep.pixelsWide;
int h=imageRep.pixelsHigh;
int bps=imageRep.bitsPerSample;

printf("Dimensions: %dx%d\n",w,h);
printf("bps: %d\n",bps);

// Get a pointer to the uncompressed, unencoded pixel data
unsigned char *pixelData = [imageRep bitmapData];

for(int j=0;j<10;j++){
    printf("Pixel %d: %d\n",j,pixelData[j]);
}

當然,您可以使用上面的代碼,並輕松地創建一個將任何文件格式轉換為PGM的小實用程序,然后您可以接受我的第一個使用PGM格式的建議,並且不需要安裝ImageMagick-盡管它實際上非常簡單homebrew

請記住,您可以使用clang(Apple的編譯器)在單個項目中將Objective-C(與上一個示例一樣)與C ++和C混合使用,因此您可以使用任何示例在問題中指出的情況下繼續使用C我已經在上面給出了。

如果您不熟悉在OSX上進行開發,則需要轉到AppStore並免費下載Apple的Xcode以獲取編譯器和庫。 那你必須做

xcode-select --install 

如果希望使用Makefile和命令行編譯/鏈接進行傳統開發,請安裝命令行工具。

該答案是試圖演示如何使用ImageMagick的MagickWand API和Xcode進行開發,並且基於OP的注釋。

安裝ImageMagick之后,啟動一個新的Xcode命令行C項目。 在編寫任何代碼之前,您需要告訴有關ImageMagick的資源/庫/等。

有很多方法可以實現這一目標,但這是我能想到的最快的方法。

  • 導航到頂級項目的“ 構建設置
  • 在“全部”(不是“基本”)下搜索“ 其他鏈接器標記
  • 在Xcode之外,打開Terminal.app並輸入以下內容
    • MagickWand-config --ldflags
  • 輸入Terminal.app的輸出作為“ 其他鏈接器標志 ”的值

其他鏈接器標志

  • 返回設置搜索; 輸入“ 其他C標志
  • 回到Terminal.app運行以下命令
    • MagickWand-config --cflags
  • 輸入結果輸出作為“ Other C Flags ”的值

其他C標志

在文件main.c ,您應該立即注意到Xcode拾取MagickWand命令。

Xcode中的MagickWand

嘗試以下操作(需要安裝X11)...

#include <stdio.h>
#include <wand/MagickWand.h>

int main(int argc, const char * argv[]) {
    MagickWandGenesis();
    MagickWand * wand;
    wand = NewMagickWand();
    MagickReadImage(wand, "wizard:");
    MagickQuantizeImage(wand, 255, GRAYColorspace, 0, MagickFalse, MagickTrue);
    MagickDisplayImage(wand, ":0");
    wand = DestroyMagickWand(wand);
    MagickWandTerminus();
    return 0;
}

...並構建+運行以進行驗證。

用C語言讀取和顯示灰度圖像

編輯

要獲取每個像素的灰度(0-255)值,您可以調用像素迭代器(請參見此處的第二個示例 ),或導出這些值 這是通過導出動態填充灰度值列表的示例。

    // Get image size from wand instance
    size_t width = MagickGetImageWidth(wand);
    size_t height = MagickGetImageHeight(wand);
    size_t total_gray_pixels =  width * height;

    // Allocate memory to hold values (total pixels * size of data type)
    unsigned char * blob = malloc(total_gray_pixels);

    MagickExportImagePixels(wand,      // Image instance
                            0,         // Start X
                            0,         // Start Y
                            width,     // End X
                            height,    // End Y
                            "I",       // Value where "I" = intensity = gray value
                            CharPixel, // Storage type where "unsigned char == (0 ~ 255)
                            blob);     // Destination pointer

    // Dump to stdout
    for (int i = 0; i < total_gray_pixels; i++ ) {
        printf("Gray value @ %lux%lu = %d\n", i % width, i / height, (int)blob[i]);
    }
    /** Example output...
     * Gray value @ 0x0 = 226
     * Gray value @ 1x0 = 189
     * Gray value @ 2x0 = 153
     * Gray value @ 3x0 = 116
     * Gray value @ 4x0 = 80
     * ... etc
     */

您可以使用以下命令在OS / X上安裝ImageMagick:

sudo port install ImageMagick

您可以從https://www.macports.org獲取macports軟件包

在Mac方面經驗不足,但在OpenCV方面我有很多經驗。 現在授予了許多OpenCV使用C ++的權限(這可能是問題也可能不是問題),但是它絕對支持您想做的所有事情以及更多。 擁有很多有用的Wiki和一個非常好的社區,這非常容易使用。

在Mac上安裝的鏈接: http : //blogs.wcode.org/2014/10/howto-install-build-and-use-opencv-macosx-10-10/

鏈接到一些OpenCV Wiki: http : //opencv.org/documentation.html

編輯:我還應該提到OpenCV的舊版本在C語言中,如果您選擇使用C語言,仍然支持許多功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM