2015-11-18 7 views
1

Я хочу загрузить изображения с серой шкалой в C, предварительно обработать его, а затем отобразить измененное изображение. Мой вопрос:Прочитайте и отобразите изображения в масштабе серого на языке C.

Каков правильный способ импорта изображений с серой шкалой (jpeg, png formats) на языке C?

Мой собственный поиск перед тем, как задавать этот вопрос.

1- fread или с управлением файлами, мы можем читать изображение, но данные будут зашифрованы (сжаты), я хочу значения шкалы серого (0-255) каждого пикселя.

2- Существует один API ImageMagick, который может быть полезным, но оно возникло проблемы установки с Mac OS X.

Я сделал обработку изображения в питоне и MATLAB, но не имеет ни малейшего представления о языке C.

Благодаря

+0

Намерение изучить обработку изображений или получить обработку некоторых изображений? –

+0

Вы хотите, чтобы ваше программное обеспечение можно было использовать только на Mac или на многих платформах? –

+1

В чем проблема с установкой ОС X? – emcconville

ответ

1

Этот ответ представляет собой попытку продемонстрировать, как разрабатывать с помощью MagicWand API ImageMagick с Xcode и основывается на комментариях OP.

После установки ImageMagick запустите новый проект командной строки Xcode C. Прежде чем писать код, вы должны сообщить о ресурсах/библиотеках ImageMagick и т. Д.

Есть много, много способов достижения этого, но вот самое быстрое, о чем я могу думать.

  • Перейдите к началу уровня проекта "Построить Настройки"
  • Под "All" (не "Basic") поиск для "Других Флагов Linker"
  • За пределов Xcode, откройте терминал .app и введите следующие
    • MagickWand-config --ldflags
  • Введите выход из Terminal.app в качестве значения "Других Флагов Linker"

Other Linker Flags

  • Назад в поиске настроек; введите "Другие C Флаги"
  • Назад в Terminal.app запустить следующие
    • MagickWand-config --cflags
  • Введите полученный вывод в качестве значения "Другие флаги С"

Other C Flags

В файле main.c вы должны сразу заметить, что Xcode собирает команды MagickWand.

MagickWand in Xcode

Попробуйте следующее (нуждается в 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; 
} 

... и построить + запустить для проверки.

Read and display gray scale images in C language

редактировать

Чтобы получить шкалу серого (0-255) значение для каждого пикселя, вы можете вызвать пиксельный итератор (см second example here) или export the values. Ниже приведен пример динамического заполнения списка значений серого путем экспорта ...

// 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 
    */ 
+0

Ницца! Есть ли способ заставить Xcode выполнять сам «MagickWand-config» и динамически получать правильные флаги, так что не имеет значения, если вы сделали «обновление для пива», а все номера версий и, возможно, квантовый диск и т. Д. Изменились ? –

+0

Да! Путем добавления шага сборки 'run shell' и экспорта переменных среды, но в Xcode требуется довольно много кликов. Почти ужасно вспоминать в начале каждого нового проекта. IMHO, гораздо проще создать локальный файл .xcconfig и перетащить-n-drop в новые проекты Xcode. – emcconville

+0

@emcconville, спасибо вам за подробное описание. У меня есть успешное построение, но я не могу получить изображение в качестве вывода. У меня установлен X11. Я использую тот же код, который вы указали здесь. – skrealworld

0

Вы можете установить ImageMagick на OS/X с помощью этой команды:

sudo port install ImageMagick 

Вы можете получить macports пакет из https://www.macports.org

0

Не имеют большой опыт работы с Mac, но я имеют много общего с OpenCV. Теперь предоставлено много OpenCV на C++ (что может быть или не быть проблемой), однако он определенно поддерживает все, что вы хотите сделать, и многое другое. Это очень легко работать с много полезной вики и очень хорошее сообщество.

Ссылка на установку на Mac: http://blogs.wcode.org/2014/10/howto-install-build-and-use-opencv-macosx-10-10/

Ссылка на некоторых OpenCV вики: http://opencv.org/documentation.html

EDIT: Я хотел бы также отметить, что более старые версии OpenCV в C и много функций по-прежнему поддерживаются если вы выбрали маршрут C.

3

У вас есть несколько вариантов, но я пройду через них, начиная с самого легкого и наименее интегрированного с OSX и постепенно интегрируясь с OSX.

Самый простой вариант

Лично я, если был умысел на обработке полутоновых изображений, я хотел бы написать свое программное обеспечение для использования портативного формата Netpbm в Greymap (PGM), как это очень проще читать и писать и легко взаимозаменяемы с другими форматами. Нет сжатия, DCT, квантования, цветовых пространств, данных EXIF ​​- просто ваши данные с простым заголовком. Документация: here.

В основном файл PGM выглядит следующим образом:

enter image description here

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 (легко читать) и greymap. Затем следующая строка говорит, что ширина 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 

Лично я бы установить ImageMagick с помощью homebrew. Вы переходите к the homebrew website и копируете однострочный вкладыш и вставляете его в терминал для установки homebrew. После этого вы можете установить ImageMagick с:

brew install imagemagick 

и, кстати, если вы хотите попробовать другие предложения здесь, используя OpenCV, то это так же просто, как

brew search opencv 
brew install homebrew/science/opencv 

Если вы хотите небольшой, автономный пример небольшого проекта OpenCV, посмотрим на мой ответ на другой вопрос here - вы также можете увидеть, как такой проект возможен из командной строки с ImageMagick в моем другом answer по тому же вопросу.

Magick ++

Если вы решили установить ImageMagick с помощью homebrew вы получите Magick ++, который позволит вам написать свои алгоритмы в C и C++. Он довольно прост в использовании и может работать на любых платформах, включая OSX, Windows и Linux, поэтому он привлекателен с этой точки зрения. Он также имеет множество функций обработки изображений, встроенных в него. Существует хороший учебник here и документация here.

Ваш код будет выглядеть примерно так:

// 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 Option

Другой ПОЛНОСТЬЮ ОТДЕЛЬНАЯ вариантом было бы использовать инструменты, которые Apple, предназначенных для работы с изображениями - они быстро и просты в использовании, но не будут работать в Linux или Windows. Так, например, если вы хотите

а) загрузите PNG-файл (или TIFF или JPEG, просто измените расширение)

б) сохранить его в виде файла JPEG

с) процесса отдельные пиксели

// 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.

Помните, что вы можете комбинировать Objective-C (как в последнем примере) с C++ и C в одном проекте, используя clang (компилятор Apple), чтобы вы могли перейти на C, как вы указываете в своем вопросе, с помощью любой из приведенных выше примеров.

Если вы новичок в разработке на OSX, вам нужно зайти в AppStore и бесплатно загрузить Apple Xcode, чтобы получить компилятор и библиотеки. Тогда вы должны сделать

xcode-select --install 

для установки инструментов командной строки, если вы хотите, чтобы сделать традиционное развитие с помощью Makefiles и командной строки компиляции/ссылок.

+0

Благодарим вас за включение примечания 'xcode-select -install'. Люди забывают простую предзадачу. – emcconville