Как узнать данные карты местности, если у нас есть только изображение? - PullRequest
1 голос
/ 16 сентября 2010

Диаграмма области (изображение) имеет несколько рядов данных, которые нанесены на карту разными цветами.Мы знаем размер изображения и координаты каждой метки на оси X. Можно ли обнаружить серию оси Y по распознаванию изображения?Кто-нибудь может пролить свет?

1 Ответ

1 голос
/ 16 сентября 2010

Если вы знаете масштаб оси Y, это должно быть возможно.

Для скрининга вы можете сначала отфильтровать изображение с помощью цветового фильтра для каждой серии. Второй шаг - собрать координаты всех оставшихся пикселей во временном изображении и преобразовать их в необходимый масштаб.

дано

  • пиксель с координатами x, y
  • смещение диаграммы происхождения в пикселях изображения xoffset, yoffset
  • Масштаб вашей диаграммы, ось xscale, yscale

Вы можете рассчитать данные для этого пикселя (псевдокод)

pixelData.x := (x - xoffset) * xscale
pixeldata.y := (y - yoffset) * yscale

И после этого, сделайте некоторую интерполяцию, если ваша строка серии имеет ширину более одного пикселя (например, получите средние данные для всех пикселей в одном столбце или около того).

Обновление 1: псевдокод для наивного цветового фильтра, отфильтровывающего красные диаграммы

//set up desired color levels to filter out
redmin := 240;
redmax := 255
bluemin := 0;
bluemax := 0;
greenmin := 0
greenmax := 0;

//load source bitmap
myBitmap := LoadBitmap("Chartfile.bmp");

//loop over bitmap pixels
for iX := 0 to myBitmap.width-1 do
  for iY := 0 myBitmap.height-1 do
    begin  
      myColorVal := myBitmap.GetPixels(iX, iY);
      //if the pixel color is inside your target color range, store it
      if ((mycolorVal.r >=redmin) and (myColorVal.r <= redmax)) and
         ((mycolorVal.g >=greenmin) and (myColorVal.g <= greenmax)) and
         ((mycolorVal.b >=bluemin) and (myColorVal.b <= bluemax)) then 
         storeDataValue(iX, iY); //performs the value scaling operation mentioned above
    end;
...