Python:为边缘检测设置一个带有序列错误的数组元素

标签 python arrays

我在使用序列设置数组元素时出错,我不确定如何修复它。触发错误的行是:

ret[q,l] = (50,255,20)
ValueError: setting an array element with a sequence.

我想做的是将灰度图像中的脱粒数组(位于边缘)中的每个像素更改为绿色,但是我不断收到此错误。

这也是我的边缘检测代码的其余部分:

def edgeDetect(img, threshold):
    ret = img.copy()
    thresh = []
    h = img.shape[0]
    w = img.shape[1]
    for y in range(1, h-2):
        for x in range(1, w-2):
            gx = 0
            gy = 0
            gx = (img.item(y, x)*0 + img.item(y + 1, x)*0 + img.item(y-1, x)*0 + img.item(y, x+1)*2 + img.item(y, x-1)*-2 + img.item(y+1, x+1)*1 + img.item(y-1, x-1)*-1 + img.item(y+1, x-1)*-1 + img.item(y-1, x+1)*1)
            gy = (img.item(y, x)*0 + img.item(y + 1, x)*-2 + img.item(y-1, x)*2 + img.item(y, x+1)*0 + img.item(y, x-1)*0 + img.item(y+1, x+1)*-1 + img.item(y-1, x-1)*1 + img.item(y+1, x-1)*-1 + img.item(y-1, x+1)*1)
            result = gx**2 + gy**2
            if(result > float(threshold)**2):
                thresh.append([y,x])
    for p in range(len(thresh)):
        print()
        q, l = thresh[p]
        img[q,l] = (50,255,20)
    return ret

最佳答案

您可能正在尝试将 3 channel 值(如果使用 OpenCV,则为 RGB 或 BGR)设置为单 channel 数组(即灰度)。

换句话来说,img数组的形状是什么?如果您的图像是 256x256 像素,那么形状是 (256,256) 还是 (256,256,3)?如果是后者,您应该能够将像素值(三元组)设置为 img[row,col,:] = (r,g,b)

如果我假设img只是单 channel ,那么你需要做的就是将现有的单 channel 图像转换为3 channel ,然后设置颜色。

OpenCV 的 cvtColor(...) 是一种将灰度图像转换为 BGR/RGB 的简单方法,但您也可以使用直接的 numpy 命令执行相同的操作。

关于Python:为边缘检测设置一个带有序列错误的数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35564875/

相关文章:

python - 如何结束程序(Python)?

ruby - 数组的所有组合

arrays - 使用 JUnit 5 断言 List<String[]>

arrays - Scala:Array.toArray 的用例?

python - .gitignore 样式 fnmatch()

python - 为什么 `gensim` 中的 tf-idf 模型在我转换语料库后丢弃了术语和计数?

c++ - 怀疑std::array C++11库坏了?我该怎么办?

c - 如何在c中制作不同大小的数组?

python - 以平台无关的方式拆分双新行

python - sqlite 不保存小数,但在 MySQL 中工作正常