用C语言读取和显示灰度图像。

我想在C中加载灰度图像,预处理它然后显示修改后的图像。 我的问题是:

用C语言导入灰度图像(jpeg,png格式)的正确方法是什么?

在问这个问题之前我自己搜索。

1- fread或文件管理,我们可以读取图像,但数据将被加密(压缩),我想要每个像素的灰度值(0-255)。

2-有一个API ImageMagick可能会有所帮助,但它在Mac OS X上存在安装问题。

我已经在python和matlab中完成了图像处理,但对C语言却一无所知。

谢谢

这个答案试图演示如何使用Xcode开发ImageMagick的MagickWand API,并基于OP的评论。

安装ImageMagick后,启动一个新的Xcode命令行C项目。 在编写任何代码之前,您需要告诉llvm有关ImageMagick资源/库/等的信息。

有许多方法可以实现这一目标,但这是我能想到的最快的方法。

  • 导航到顶级项目的“ 构建设置
  • 在“全部”(不是“基本”)下搜索“ 其他链接标志
  • 在Xcode之外,打开Terminal.app并输入以下内容
    • MagickWand-config --ldflags
  • 输入Terminal.app的输出作为“ Other Linker Flags ”的值

其他链接器标志

  • 回到设置搜索; 输入“ 其他C标志
  • 回到Terminal.app运行以下命令
    • MagickWand-config --cflags
  • 输入结果输出作为“ 其他C标志 ”的值

其他C旗帜

在文件main.c ,您应该注意Xcode立即拾取MagickWand命令。

MagcodeWand在Xcode中

尝试以下(需要安装X11)……

 #include  #include  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; } 

…并构建+运行以validation。

用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 */ 

你有很多选择,但我会从最简单和最不集成的OSX开始,逐步与OSX集成。

最简单的选择

就个人而言,如果我打算处理灰度图像,我会编写我的软件以使用NetPBM的Portable Greymap(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并以二进制forms写入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 。 然后你可以安装ImageMagick:

 brew install imagemagick 

顺便说一句,如果你想在这里尝试其他建议,使用OpenCV,那就简单了

 brew search opencv brew install homebrew/science/opencv 

如果你想要一个小的,自包含的一个小OpenCV项目的例子,看看我在这里的另一个问题的答案 – 你也可以看到这样的项目如何可以通过命令行与ImageMagick在我的另一个答案中同样的问题。

Magick ++

如果您选择使用homebrew安装ImageMagick,您将获得Magick ++,它将允许您使用C和C ++编写算法。 它非常易于使用,可以在任何平台上运行,包括OSX,Windows和Linux,因此从这个角度来看它很有吸引力。 它还内置了许多很多图像处理function。这里有一个很好的教程和文档。

您的代码将如下所示:

 // 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和命令行编译/链接进行传统开发,请安装命令行工具。

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

 sudo port install ImageMagick 

您可以从https://www.macports.org获取macports

没有太多的Mac经验,但我对OpenCV有很多了解。 现在授予很多OpenCV是C ++(这可能是也可能不是问题),但它肯定支持你想做的一切以及更多。 有很多有用的维基和非常好的社区,很容易合作。

链接到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路线,仍然支持很多function。