Arhn - архитектура программирования

Почему, выполняя выравнивание гистограммы с помощью изображения scikit для двоичного изображения, я получил черное изображение после преобразования mahotas?

Я использовал гистограммное выравнивание и адаптацию для стирания освещения с изображений в градациях серого, но после выравнивание гистограммы (я использовал библиотеку scikit image python) было хорошо, во время преобразования изображения в mahotas что-то пошло не так. У меня получилась картина total black. Как я могу это исправить?

  • Исходное изображение:

Исходное изображение

  • Выравнивание и адаптация гистограммы;

Выравнивание гистограммы на изображении

  • Результат после конвертации махот.

maho conv

код преобразования из scikit в mahotas:

binimg = np.array(img_adapteq, dtype=np.bool)

Исходный код:

import scipy
import numpy as np
import pymorph as pm
import mahotas as mh
from skimage import morphology
from skimage import io
from matplotlib import pyplot as plt
from skimage import data, img_as_float
from skimage import exposure
def plot_img_and_hist(img, axes, bins=256):
    """Plot an image along with its histogram and cumulative histogram.

    """
    img = img_as_float(img)
    ax_img, ax_hist = axes
    ax_cdf = ax_hist.twinx()

    # Display image
    ax_img.imshow(img, cmap=plt.cm.gray)
    ax_img.set_axis_off()

    # Display histogram
    ax_hist.hist(img.ravel(), bins=bins, histtype='step', color='black')
    ax_hist.ticklabel_format(axis='y', style='scientific', scilimits=(0, 0))
    ax_hist.set_xlabel('Pixel intensity')
    ax_hist.set_xlim(0, 1)
    ax_hist.set_yticks([])

    # Display cumulative distribution
    img_cdf, bins = exposure.cumulative_distribution(img, bins)
    ax_cdf.plot(bins, img_cdf, 'r')
    ax_cdf.set_yticks([])

    return ax_img, ax_hist, ax_cdf


mhgray = mh.imread(path,0)
binimg = mhgray[:,:,0]
print(type(binimg[0][0]))
thresh = mh.otsu(binimg)
gray =( binimg< thresh)

shape = list(gray.shape)
w = 0
if (shape[0] > shape[1]):
    shape = shape[0]
else:
    shape = shape[1]

if (shape < 100):
    w =  int((shape/100 )*1.5)
elif(shape > 100 and shape <420):
    w =  int((shape/100 )*2.5)
else:
    w = int((shape/100)*4)
disk7 = pm.sedisk(w)

img = binimg

# Contrast stretching
p2 = np.percentile(img, 2)
p98 = np.percentile(img, 98)
img_rescale = exposure.rescale_intensity(img, in_range=(p2, p98))

# Equalization
img_eq = exposure.equalize_hist(img)

# Adaptive Equalization
img_adapteq = exposure.equalize_adapthist(img, clip_limit=0.03)

# Display results
f, axes = plt.subplots(2, 4, figsize=(8, 4))

ax_img, ax_hist, ax_cdf = plot_img_and_hist(img, axes[:, 0])
ax_img.set_title('Low contrast image')

y_min, y_max = ax_hist.get_ylim()
ax_hist.set_ylabel('Number of pixels')
ax_hist.set_yticks(np.linspace(0, y_max, 5))

ax_img, ax_hist, ax_cdf = plot_img_and_hist(img_rescale, axes[:, 1])
ax_img.set_title('Contrast stretching')

ax_img, ax_hist, ax_cdf = plot_img_and_hist(img_eq, axes[:, 2])
ax_img.set_title('Histogram equalization')

ax_img, ax_hist, ax_cdf = plot_img_and_hist(img_adapteq, axes[:, 3])
ax_img.set_title('Adaptive equalization')

ax_cdf.set_ylabel('Fraction of total intensity')
ax_cdf.set_yticks(np.linspace(0, 1, 5))

# prevent overlap of y-axis labels
plt.subplots_adjust(wspace=0.4)
plt.show()


plt.gray()
plt.subplot(121)
plt.title("after histo")
plt.imshow(img_adapteq)
plt.show()

binimg = np.array(img_adapteq, dtype=np.bool)#uint16

plt.gray()
plt.subplot(121)
plt.title("after otsu")
plt.imshow(binimg)
plt.show()

imgbnbin = mh.morph.dilate(binimg, disk7)

#2     
plt.gray()
plt.subplot(121)
plt.title("after dilate before close")
plt.imshow(imgbnbin)
plt.show()

imgbnbin = mh.morph.close(imgbnbin, disk7)
#2     
plt.gray()
plt.subplot(121)
plt.title("before skeletonize")
plt.imshow(imgbnbin)
plt.show()

imgbnbin = mh.morph.close(imgbnbin, disk7)
out = morphology.skeletonize(imgbnbin>0)

Ответы:


1

Алгоритм scikit-image, вероятно, возвращает изображение с плавающей запятой со значениями от 0 до 1. Если вы примените это к bool, вы получите все единицы. Вы, вероятно, хотите

binimg = img_adapteq > 0.5

В общем, также обратите внимание на функцию rescale_intensity, которая берет изображение со значениями от 0 до 1 и возвращает изображение со значениями от 0 до 255.

from skimage import exposure image = rescale_intensity(image, out_range=(0, 255))

27.01.2014
  • they aren't floating points, i wrote: print(img_adapteq[0]) and was printed: [16317 16317 16317 16317 16317 16317 16317 16317 16317 16317 16317 16317 16317 16317 16317 16317 16319 16322 16325 16328 16331 16334 16336 16339 16342 16345 16348 16351 16353 16356 16359 16362 16365 16368 16370 16373......... 16317 16317 16317 16317 16317 16317 16317 16317 16317 16317 16317 16403 16403 16403 16403 16403 16403 16403 16403 16403 16403 16403 16403 65535 65535 65535 65535 65535] 27.01.2014
  • Да, так что у вас есть: In [7]: np.array(x, dtype=np.bool) Out[7]: array([ True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True], dtype=bool) 28.01.2014
  • но если вы сказали мне заменить binimg = np.array(img_adapteq, dtype=np.bool) на binimg = img_adapteq › 0.5, это что-то изменит! я получаю всегда [Правда, Правда, Правда, Правда, Правда, Правда, Правда, Правда, Правда, Правда, Правда, Правда, Правда, Правда, Правда....]. Все цифры >0,5 и все значения верны. Может я чего-то не понимаю! 28.01.2014
  • я думаю, что ошибка в том, что я даю изображение в оттенках серого вместо цветного изображения, после преобразования в bool я вижу правильное изображение, но после otsu это снова полностью черное изображение. Более того, я получил это предупреждение: Предупреждение (из модуля предупреждений): Файл C:\Python27\Lib\site-packages\skimage\exposure\exposure.py, строка 51 warnings.warn (это может быть цветное изображение. Гистограмма будет Предупреждение пользователя: это может быть цветное изображение. Гистограмма будет рассчитываться на плоском изображении. Вместо этого вы можете применить эту функцию к каждому цветовому каналу. 28.01.2014
  • Предупреждение (из модуля предупреждений): файл C:\Python27\Lib\site-packages\skimage\util\dtype.py, строка 107 %s to %s % (dtypeobj_in, dtypeobj)) UserWarning: возможная потеря точности при преобразовании из float64 до uint16 28.01.2014
  • Прочтите: scikit-image.org/docs/0.9.x/user_guide /data_types.html Кроме того, похоже, что вы отправляете данные о цвете в функцию выравнивания. Используйте skimage.color.rgb2gray, чтобы сначала преобразовать ваши данные в оттенки серого. Вы можете проверить, удалось ли вам это сделать, взглянув на параметр .shape изображения — оно должно быть двухмерным (не трехмерным). 28.01.2014
  • Хорошо, спасибо большое, я был таким глупым! Теперь у меня новая проблема, после хорошего преобразования, когда я использую otsu (исходный код: thresh = mh.otsu(binimg) grey =(binimg‹ thresh)) некоторые изображения были преобразованы совершенно неправильно с большим количеством белых квадратов! Перед otsu: i.imgur.com/9jnoAHn.png, после otsu: i.imgur.com/1wtZciL.png Но я думаю, что лучше создать новый аналогичный вопрос. 30.01.2014
  • Пожалуйста, выложите где-нибудь исходное изображение, тогда я посмотрю. 31.01.2014
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..