Python 无法使用scikit图像将RGB图像转换为灰度
我曾尝试将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.
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数组等),它们可能不同,但应该是相同的。