Однопиксельная обработка изображения события в python

У меня была длительная проблема с обработкой CCD-изображения источника рентгеновского излучения. Он прикреплен здесь CCD-изображение. Затем, после повторного хранения с произвольным значением, мне нужно вычесть мультипиксельные события из изображения. Мне также нужно посчитать количество пикселей, которое принадлежит отдельным пикселям.

* - под мультипикселем я подразумеваю пиксели, которые имеют ненулевое значение в шумных пикселях.

У меня есть код, работающий с использованием PIL.Image.open(), чтобы прочитать его в список и сделать анализ попиксельно! но я ищу стандартную процедуру обработки изображений для более надежных и лучших результатов. Я буду признателен, если вы можете дать мне, как это сделать.

ура

3 ответа

Решение

Прежде всего, я хочу поблагодарить @Mark Stechell за его подсказки и ответы. Затем я нашел свой ответ по его намёку на преобразование "ударил или пропустил". Я нашел хорошую информацию в Википедии как: https://en.wikipedia.org/wiki/Hit-or-miss_transform

затем в Python есть готовая функция для этого метода, которая работает для меня, а также для других прикладных программ. Вы найдете все ниже в ссылке ниже, это прямо и легко. http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.ndimage.morphology.binary_hit_or_miss.html

ура

У меня была еще одна попытка сделать это с библиотекой CImg, которая является библиотекой C++ для обработки изображений только для заголовков, которая работает на всех платформах. Это довольно приятно, поскольку есть только один простой заголовочный файл для копирования в ваш проект с веб-сайта CImg, и все готово!

Смотрите сайт CImg здесь.

Код выглядит так:

#define cimg_use_png
#define cimg_display 0
#include <iostream>
#include "CImg.h"

using namespace cimg_library;
using namespace std;

int main() {

   // Load input image
   CImg<unsigned char> im("ccd.png");
   int w=im.width();
   int h=im.height();

   // Create output image and fill with black (0)
   CImg<unsigned char> result(w,h,1,1,0);

   // Total number of white pixels with 8 black neighbours
   int t=0;

   // Threshold image at 80%
   im.threshold(255*0.8);

   // Find, and count, all white pixels with 8 black neighbours
   // Apply Dirichlet boundary conditions at edges - black virtual pixels at edges
   for(int y=0;y<h;y++){
      for(int x=0;x<w;x++){
         if((im.atXY(x,y,0,0)    !=1) ||
            (im.atXY(x-1,y-1,0,0)==1) || (im.atXY(x,y-1,0,0)==1) || (im.atXY(x+1,y-1,0,0)==1) ||
            (im.atXY(x-1,y,0,0)  ==1) || (im.atXY(x+1,y,0,0)==1) ||
            (im.atXY(x-1,y+1,0,0)==1) || (im.atXY(x,y+1,0,0)==1) || (im.atXY(x+1,y+1,0,0)==1)){
         } else {
            t++;
            // Paint output image white
            result(x,y)=255;
            cout << "DEBUG: " << x << "," << y << endl;
         }
      }
   }
   cout << t << endl;
   result.save_png("result.png");
}

И вы можете скомпилировать это с этим:

g++ peaks.cpp -o peaks -lpng

Пример вывода

Это показывает координаты x,y пикселей, которые превышают ваш порог и не имеют непосредственных белых соседей.

DEBUG: 172,1
DEBUG: 287,1
DEBUG: 390,1
DEBUG: 396,1
DEBUG: 536,1
DEBUG: 745,1
DEBUG: 956,1
DEBUG: 72,2
DEBUG: 253,2
DEBUG: 516,2
DEBUG: 671,2
DEBUG: 680,2
DEBUG: 740,2
DEBUG: 811,2
DEBUG: 844,2
DEBUG: 228,3
DEBUG: 282,3
DEBUG: 351,3
DEBUG: 505,3
DEBUG: 551,3
DEBUG: 623,3
DEBUG: 638,3
DEBUG: 689,3
...
...
DEBUG: 797,252
DEBUG: 918,252
DEBUG: 125,253
DEBUG: 357,253
DEBUG: 870,253
DEBUG: 252,254
DEBUG: 941,254
1005

Вы можете сделать это довольно легко с помощью ImageMagick, который установлен в большинстве дистрибутивов Linux и доступен для OSX и Windows. Доступны привязки C/C++, Python, Perl, PHP, Net и другие. Я просто сделаю это в командной строке здесь.

Итак, вот ваше начальное изображение:

Во-первых, давайте порог в произвольных 80%:

convert ccd.png -threshold 80% result.png

Теперь давайте найдем все белые пиксели, у которых нет других белых пикселей:

convert ccd.png -threshold 80% -morphology HMT peaks:1.9 result.png

Техника "Морфология удара и пропуска", и она описана здесь на превосходных страницах использования ImageMagick Энтони Тиссена. Найдите на этой странице "Пик", чтобы найти точный абзац.

Теперь давайте посчитаем их:

convert ccd.png -threshold 80% -morphology HMT peaks:1.9 -format "%[fx:int(mean*w*h)]" info:
975

Давайте проверим мультипиксельные события, которые мы удалили:

convert ccd.png -threshold 80% \( +clone -morphology HMT peaks:1.9 \) -compose difference -composite result.png

Другие вопросы по тегам