передача изображения лыжного мага в функцию cv2.threshold - PullRequest
0 голосов
/ 04 ноября 2018

Я хочу улучшить качество изображения, поэтому я увеличиваю разрешение, интерполирую и увеличиваю резкость с помощью Skimage и Scipy. Затем я хочу использовать порог улучшенного изображения для дальнейшего анализа. Проблема в том, что я получаю ошибку, когда пытаюсь передать массив заостренных изображений в функцию cv2.threshold.

Изображение: enter image description here

Код:

import skimage
import scipy
import cv2
import matplotlib.pyplot as plt


img = cv2.imread('Image.png')

scale = 5
img_rs = skimage.transform.rescale(image = img,
                                   scale = scale,
                                   order = 3,
                                   mode = 'wrap',
                                   cval = 0,
                                   multichannel = True,
                                   anti_aliasing = 'none')
img_int = scipy.misc.imresize(img_rs, 0.99999, interp = 'cubic')
img_int_gray = skimage.color.rgb2gray(img_int)
blurred_img = scipy.ndimage.gaussian_filter(img_int_gray, 3)
filter_blurred_img = scipy.ndimage.gaussian_filter(blurred_img, 1)
alpha = 30
sharp_img = blurred_img + alpha * (blurred_img - filter_blurred_img)
_, thresh = cv2.threshold(sharp_img,
                          0,
                          255,
                          cv2.THRESH_BINARY+cv2.THRESH_OTSU)


plt.imsave('sharp_img.png', sharp_img, cmap = 'gray')

Выход:

Traceback (most recent call last):
  File "/home/artur/Desktop/test.py", line 32, in <module>
    cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.error: OpenCV(3.4.3) /io/opencv/modules/imgproc/src/thresh.cpp:1406: error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'threshold'

Я пытался преобразовать изображение перед передачей в функцию cv.threshold с помощью:

sharp_img = skimage.img_as_ubyte(sharp_img)

Выход:

Traceback (most recent call last):
  File "/home/artur/Desktop/test.py", line 24, in <module>
    sharp_img = skimage.img_as_ubyte(sharp_img)
  File "/home/artur/.local/lib/python3.6/site-packages/skimage/util/dtype.py", line 492, in img_as_ubyte
    return convert(image, np.uint8, force_copy)
  File "/home/artur/.local/lib/python3.6/site-packages/skimage/util/dtype.py", line 261, in convert
    raise ValueError("Images of type float must be between -1 and 1.")
ValueError: Images of type float must be between -1 and 1.

Как мне сделать эту работу?

1 Ответ

0 голосов
/ 04 ноября 2018

Вам необходимо убедиться, что значения пикселей заостренного изображения находятся в диапазоне от -1 до 1. Для этого вы можете нормализовать sharp_img в диапазоне [0, 1] перед преобразованием в uint8 или просто использовать NumPy's клип как это:

sharp_img = skimage.img_as_ubyte(np.clip(sharp_img, 0, 1))
...