【问题标题】:TypeError: pic should be PIL Image or ndarray. Got <class ‘bool’>TypeError: pic 应该是 PIL Image 或 ndarray。得到 <class ‘bool’>
【发布时间】:2020-11-05 12:33:18
【问题描述】:

我想使用 Open CV 分割图像,然后输入到 by PyTorch 模型以计算每个图像中的对象。运行代码时收到以下错误消息:TypeError: pic should be PIL Image or ndarray.得到

import os

import numpy as np
import torch
from PIL import Image
from torch.utils.data import Dataset
from torchvision import transforms, utils
#from torchvision.transforms import Grayscalei
import pandas as pd
import pdb
import cv2

class CellsDataset(Dataset):
    # a very simple dataset

    def __init__(self, root_dir, transform=None, return_filenames=False):
        self.root = root_dir
        self.transform = transform
        self.return_filenames = return_filenames
        self.files = [os.path.join(self.root,filename) for filename in os.listdir(self.root)]
        self.files = [path for path in self.files
                      if os.path.isfile(path) and os.path.splitext(path)[1]=='.png']

    def __len__(self):
        return len(self.files)

    def __getitem__(self, idx):
        path = self.files[idx]
        sample = Image.open(path)        

        sample = cv2.imread(path)
        b,g,r=cv2.split(sample)
        sample=cv2.imwrite('sample.png', g)


        #transform3 = Grayscale(num_output_channels=3)
        #sample = transform3(sample) # convert to a 3 channel grayscale, as it needs to be 3 channel.
        if self.transform:
            sample = self.transform(sample)

        if self.return_filenames:
            return sample, path
        else:
            return sample

【问题讨论】:

    标签: python opencv pytorch


    【解决方案1】:

    变量sample 被重新分配给cv2.imwrite 在此行中返回的内容:

    sample=cv2.imwrite('sample.png', g)
    

    这会用其他东西替换你的 ndarray。

    尝试用简单的cv2.imwrite('sample.png', g) 替换该行,而不将评估表达式的值分配给sample

    【讨论】:

    • 非常感谢您的帮助。该代码现在可以正常运行,没有任何错误。如果我打印图像 cv2.imshow('sample',2) - 它显示为灰度而不是绿色,请问有什么想法吗?
    • 您发送的 sn-p 根本不起作用,因为 'sample' 是一个字符串。但可能您正在向 imshow 发送 1 通道图像(ndarray),而 cv2 只会将其显示为亮度通道,无论您最初是否通过拆分 rgb 图像中的通道来获得 1 通道图像。
    • 听起来你想做颜色过滤。使用 cv2 做一些比选择频道更复杂的事情并不太复杂。参见例如:geeksforgeeks.org/filter-color-with-opencv 虽然也可以在通道上使用一个简单的阈值作为掩码:mask = g &gt; 128。对于这两个面具:masked_sample = cv2.bitwise_and(sample, sample, mask)
    • @AA2018-2020 cv2.imwrite 返回一个bool 表示图像是否成功写入磁盘。以后使用 cv2.imwrite 时请记住这一点。
    猜你喜欢
    • 2021-06-24
    • 2019-11-06
    • 2021-07-06
    • 1970-01-01
    • 2021-11-04
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多