LINUX.ORG.RU
ФорумTalks

Распознание фотографий.


0

0

Есть фотография - черные пятна на светло-серой поверхности. Надо найти следующее - отношение площади черных пятен к полной площади поверхности.

Подскажите с помощью чего это вообще можно сделать?

anonymous

задай критерий чёрности, потом посчитай кол-во пикселов удовлетворяющих критерию да подели на общее кол-во

lg ★★
()

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
// подключить API ImageMagick
#include <magick/api.h>

int main(int argc,char **argv) {
//Воспользоваться внутренними типами IM
  ExceptionInfo
      exception;
  Image
      *image;
  ImageInfo
      *image_info;
  PixelPacket 
      *pixels;
  ViewInfo 
      *vinfo;
  int i,j,w,h,m;
// Инициализировать структуру image info и прочитать изображение
  InitializeMagick(*argv);
// установить обработку событий типа ReadError и т.п.
  GetExceptionInfo(&exception);
// сделлать копию структуры image info
  image_info=CloneImageInfo((ImageInfo *) NULL);
// скопировать в структуру имя файла
  (void)strcpy(image_info->filename,"image.gif");
// прочитать картинку, попутно отработав эксепшены &exception 
  image=ReadImage(image_info,&exception);
  if (image == (Image *) NULL) {
// в случае ошибки
    fprintf(stderr, "readFileMagick: %s: %s\n",
    exception.reason,exception.description);
// MagickError(exception.severity,exception.reason,exception.description);
    return -1;
  }
// открыть открыть просмотр кеша пикселей
  vinfo = OpenCacheView(image);
  pixels = GetCacheView(vinfo, 0,0,image->columns,image->rows);
  if(!pixels) {
    fprintf(stderr, "readFileMagick: ошибка чтения кеша пикселей.\n"); 
    return(-1);
  }
  h = image->columns; //ширина по горизонтали (число столбцов картинки)
  w = image->rows;    //высота по вертикали   (число строк картинки)
// вывести значения пикселов по трем каналам
  for (i = 0; i <= w-1; i++) {
    for (j = 0; j <= h-1; j++) {
      m=(int)255*pixels[j+h*i].blue/65535);
      if (m==0) count+=m;
    }
  }
  printf ("отношение черного ко всему %d \n", int(m/(w*h)));
// закрыть и уничтожить все
  CloseCacheView(vinfo);
  DestroyImageInfo(image_info);
  DestroyImage(image);
  return(0);
}

компилировать:

setenv LD_LIBRARY_PATH /usr/local/lib
gcc `Magick-config --cflags --cppflags` pixels.c `Magick-config --ldflags --libs`

запускать ./a.out imagefile.tiff

vilfred ☆☆
()
Ответ на: комментарий от vilfred

слажал, вместо

printf ("отношение черного ко всему %d \n", int(m/(w*h)));

надо

printf ("отношение черного ко всему %d \n", int(count/(w*h)));

vilfred ☆☆
()

самое что прикольное, задай ты этот вопрос в Development - хрен бы кто ответил ;))

lg ★★
()
Ответ на: комментарий от vilfred

m=(int)255*pixels[j+h*i].blue/65535); - тут скобку надо вроде как убрать в конце строки.

vilfred ☆☆
()
Ответ на: комментарий от vilfred

3 патча за плл-часа =)
Неплохо, воистину оперативно =)

ManJak ★★★★★
()

вы все лохи позорные! Избаловались на современных мощностях.

Слушайте байку. В 70-ых мы и американцы решали задачу о нахождении обьёмной доли фазы. Делается это так:

а) берётся железяка;

б) поверхность травится кислотой;

в) фазы травятся с разной скоростью => одни становятся темнее чем другие. считаем долю фазы в слое х;

д) снимаем кусок поверхности (переходим к слою х+1);

е) иди на б.

Вот примерно так мы и они и поступали: пошлифовали, потравили, сфотографировали.

Теперь фотографии нужно обработать.

американский метод:

а) оцифровали фотки;

б) наняли программеров, которие написали программу, обсчитываюсщую картинки (а дело было в 70-ых, если кто забыл);

г) с помощью программы обработали данные.

Затратили много денег и времени.

русский метод:

а) мобилизовали всех, вплоть до уборшищ и вручили ножницы;

б) вырезали из фоток все изобразения одной фазы;

в) взесили вырезки и обрезки;

г) всё!

Несколько дней и результат готов.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Сам ты лох позорный.

Амеры: Дали работу программистам, манагерам... На выходе получили продукт, который можно ещё не однократно применять.

Рашн: Вместо/после работы занимались худ. вырезкой: качество которой будет весьма-весьма сомнительно(или вы думаете что тётя Груня будет старательно что-то вырезать и раскладывать после первого часа такого мозго%&#8470;*ма???), обрезки имеют свойство теряться...

anonymousI
()
Ответ на: комментарий от ugoday

>американский метод:

<snip>

> Затратили много денег и времени.

> русский метод:

<snip>

А посветить на фотографию и померить интенсивность отраженного света не судьба было? Затратили бы меньше минуты :)

AEP ★★★★★
()
Ответ на: комментарий от vilfred

Re>"у меня просто колекция рецептов на всякий случай есть"
vilfred cookbook : )

se ★★
()
Ответ на: комментарий от anonymousI

>Дали работу программистам,

Программисты с чего-то важного и нужного, были перекинуты на этот фронт, где их труд был использован абсолютно неэффективно. Молодцы янки.

> манагерам.

Да уж. Вот в чём они нас наголову превосходят и превосходить будут, так это в умении находить работу манагерам, пиарщикам, рекламщикам и прочим паразитам.

>На выходе получили продукт, который можно ещё не однократно применять.

Это вряд ли. Скорее всего данный продукт можно было применять только для того же самого материала (под этим понимается тот же фазовый и структурный состав), того же самого травителя, условий съёмки и т.д и т.п. А для этих условий исследование уже проведено.

> Вместо/после работы

Что значит вместо?

>качество которой б

anonymousI, ты хоть раз в микроскоп на шлиф смотрел? или хотя бы на картинках видел? Там иной раз такая петрушка творится, что глазом не разберёшь. А программа тем более не справится. Программы распознования изображений и сейчас выглядят позорно по сравнению с человеком, я уж молчу про семидесятые годы прошлого века.

Итого: русские получили более качественный результат за меньшее время и затратив меньше усилий. А всё потому что решали задачу с умом, а не тупым лобовым штурмом.

ugoday ★★★★★
()
Ответ на: комментарий от AEP

>А посветить на фотографию и померить интенсивность отраженного света не судьба было?

Не судьба. Не заработает такой способ.

ugoday ★★★★★
()
Ответ на: комментарий от ManJak

когда будет фотка миллиард на миллиард, тогда попробуй примени решение в лоб.

hatefu1_dead
()
Ответ на: комментарий от Sun-ch

> (/ Сколько-раз-попал-в-черное Общее-число-реализаций)

а указать дисперсию и доверительный интервал для решения? без этого не считается.

hatefu1_dead
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.