Как я могу вычесть фон из изображения в mahotas и opencv в python?

У меня есть много изображений, таких как это или это и я использую этот код:

fork = mh.imread(path)
bin = fork[:,:,0]
bin = mh.erode(bin)
bin = (bin < 80)

для 2-го изображения, но я должен использовать это:

bin = (bin < 127)

во-первых.

Есть способ автоматически получить хорошее изображение без фона, или мне нужно выбрать среднее значение, надеюсь, оно подходит для большинства моих изображений?


person postgres    schedule 16.01.2014    source источник


Ответы (2)


Существует пороговое значение, которое называется «Порог Оцу». Здесь вы найдете дополнительную информацию.

Вы можете использовать otsu, чтобы сделать это в Mahotas, или threshold_otsu в scikit-image:

fork = mh.imread(path)
bin = fork[:,:,0]
thresh = mh.otsu(bin)
binary =( bin< thresh)
person phyrox    schedule 16.01.2014
comment
Я бы не назвал Otsu оптимальным, так как он не всегда уместен. Возможно, есть автоматизированный метод... , который хорошо работает, когда передний план хорошо отделен. - person luispedro; 17.01.2014
comment
Ну, я использовал mh.otsu в первом изображении, и оно не работает: левая часть изображения почти вся белая! Может, есть еще чем заняться? - person postgres; 17.01.2014
comment
По предложению @luispedro я удалил слово «оптимальный». - person phyrox; 17.01.2014
comment
@postgres У вас проблемы с подсветкой. Перед использованием Otsu необходимо выполнить некоторое выравнивание гистограммы. Здесь у вас есть дополнительная информация: scikit-image.org/docs/0.9. x/auto_examples/plot_equalize.html - person phyrox; 17.01.2014
comment
Ой ну спасибо! Это работает, но для преобразования изображения из scikit в mahotas? я использовал это: binimg = np.array (img_adapteq, dtype = np.uint8), и я получил полностью черное изображение! - person postgres; 19.01.2014
comment
@postgres Я не знаком с махотами, но зачем вам конвертировать в махот? Если вы установили образ scikit, вы можете использовать threshold_otsu() из scikit - person phyrox; 19.01.2014
comment
потому что я также использовал расширение, эрозию, функцию закрытия и другие вещи в mahotas, я знаю, что они также есть в scikit, но с использованием dtype преобразование изображения было хорошим по сравнению с другими библиотеками, такими как cv2 и scikit - person postgres; 19.01.2014
comment
Я пробовал это binimg = binimg › 0.5, но все значения конвертируются в False. Более того, я получаю это предупреждение: Файл C:\Python27\Lib\site-packages\skimage\exposure\exposure.py, строка 51 warnings.warn (это может быть цветное изображение. Гистограмма будет UserWarning: это может быть цветное изображение.Гистограмма будет рассчитываться на плоском изображении.Вместо этого вы можете применить эту функцию к каждому цветовому каналу. - person postgres; 28.01.2014
comment
Я сделал следующие шаги: 1) imread(image) 2) выравнивание гистограммы 3) преобразование с помощью binimg › 0.5 или np.array(img_adapteq, dtype=np.uint16) 4) бинаризация mhgray[:,:,0] 5) otsu binimg = binimg › 0,5 порог = mh.otsu(binimg) - person postgres; 28.01.2014
comment
@postgres Я не понимаю код, который вы разместили ... но кажется, что ваш binimg представляет собой N-мерный массив, а не двумерный массив. - person phyrox; 28.01.2014

Я понимаю, что вы хотите отделить белый фон от изображения. Вот шаги, чтобы сделать это. Я буду писать простым английским языком, потому что я не знаком с питоном.

1: Рассчитать закрытие изображения (применение расширения, а затем эрозии). Используйте структурный элемент в виде квадрата размером 5x5 для расширения и эрозии.

C = mh.dilate(bin)
C = mh.erode(C);

Это даст вам фон

2: Вычтите фон из исходного изображения:

C = C-bin

Это даст вам изображение звезды, окрашенной в белый цвет, а фон черный.

3: Теперь вычислите автоматический порог для бинаризации. Используйте простой метод Otsu для оценки наилучшего порога. В openCV это что-то вроде:

double thresh = cv::threshold(im,im,0,255,CV_THRESH_BINARY | CV_THRESH_OTSU);
cv::threshold(im,im,thresh,255,CV_THRESH_BINARY_INV);

Это даст вам идеальные результаты для ваших изображений. Не пытайтесь угадать порог. Это не 80 и не 127 для ваших изображений. Используйте Оцу

person DanielHsH    schedule 16.01.2014