Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用scikit图像将RGB图像转换为灰度_Python_Image_Opencv_Binary_Scikit Image - Fatal编程技术网

Python 无法使用scikit图像将RGB图像转换为灰度

Python 无法使用scikit图像将RGB图像转换为灰度,python,image,opencv,binary,scikit-image,Python,Image,Opencv,Binary,Scikit Image,我曾尝试将RGB图像转换为大津二值图像(灰度),但这似乎不起作用,因为我得到了下面提到的错误 from cv2 import cv2 import numpy as np from skimage.color import rgb2gray from skimage.filters import threshold_otsu from skimage.io import imread from skimage.morphology import skeletonize from skimage.

我曾尝试将RGB图像转换为大津二值图像(灰度),但这似乎不起作用,因为我得到了下面提到的错误

from cv2 import cv2
import numpy as np
from skimage.color import rgb2gray
from skimage.filters import threshold_otsu
from skimage.io import imread
from skimage.morphology import skeletonize
from skimage.util import invert
import matplotlib.pyplot as plt

img = rgb2gray(imread('Ared.png'))
binary = img > threshold_otsu(img)
np.unique(binary)
skeleton = skeletonize(invert(binary))
cv2.imshow('original', img)
cv2.imshow('skeleton', skeleton)
cv2.waitKey(0)
cv2.destroyAllWindows()
导致终端

  img = rgb2gray(imread('Ared.png'))
Traceback (most recent call last):
  File "preprocessing.py", line 16, in <module>
    cv2.imshow('skeleton', skeleton)
TypeError: Expected Ptr<cv::UMat> for argument '%s'
img=rgb2gray(imread('Ared.png'))
回溯(最近一次呼叫最后一次):
文件“preprocessing.py”,第16行,在
cv2.imshow(“骨架”,骨架)
TypeError:参数“%s”应为Ptr

错误的异常消息是错误的

cv2.imshow
不处理二进制数组。根据答案,可接受的类型有
uint8
uint16
int
float
double

您应该能够使用以下工具将数组转换为
uint8

skeleton.astype('u1')
这将给您留下介于0和1之间的值,这些值都非常暗。如果将数组乘以255,则颜色应为预期的黑色和白色:

skeleton.astype('u1') * 255
来自skimage的数据图像的完整示例:

from cv2 import cv2
from skimage.filters import threshold_otsu
from skimage.morphology import skeletonize
from skimage.util import invert
from skimage.data import camera

img = camera()
binary = img > threshold_otsu(img)
skeleton = skeletonize(invert(binary))
cv2.imshow('original', img)
cv2.imshow('skeleton', skeleton.astype('u1')*255)
cv2.waitKey(0)
cv2.destroyAllWindows()

错误的异常消息是错误的

cv2.imshow
不处理二进制数组。根据答案,可接受的类型有
uint8
uint16
int
float
double

您应该能够使用以下工具将数组转换为
uint8

skeleton.astype('u1')
这将给您留下介于0和1之间的值,这些值都非常暗。如果将数组乘以255,则颜色应为预期的黑色和白色:

skeleton.astype('u1') * 255
来自skimage的数据图像的完整示例:

from cv2 import cv2
from skimage.filters import threshold_otsu
from skimage.morphology import skeletonize
from skimage.util import invert
from skimage.data import camera

img = camera()
binary = img > threshold_otsu(img)
skeleton = skeletonize(invert(binary))
cv2.imshow('original', img)
cv2.imshow('skeleton', skeleton.astype('u1')*255)
cv2.waitKey(0)
cv2.destroyAllWindows()

你的格式不对。您需要将其更改为float32。这是opencv的常见错误。您可以更改此行以将其转换为float32,它应该可以正常工作

cv2.imshow('skeleton', np.float32(skeleton))

你的格式不对。您需要将其更改为float32。这是opencv的常见错误。您可以更改此行以将其转换为float32,它应该可以正常工作

cv2.imshow('skeleton', np.float32(skeleton))

根本不是答案,但是您是否尝试过查看
框架
变量内部(例如打印它)?你应该检查它的值范围([0,1]?[0,255]?)和它们的类型(float?uint8?)我感觉问题不是因为你使用了skimage,而是cv2,当要求它显示图像时有点挑剔。使用调试器比较img和skeleton的数据类型(int数组、float32数组等),它们可能不同,但应该是相同的。根本不是答案,但您是否尝试过查看
框架
变量内部(例如打印它)?你应该检查它的值范围([0,1]?[0,255]?)和它们的类型(float?uint8?)我感觉问题不是因为你使用了skimage,而是cv2,当要求它显示图像时有点挑剔。使用调试器比较img和skeleton的数据类型(int数组、float32数组等),它们可能不同,但应该是相同的。