ValueError: could not broadcast input array from shape (1,19) into shape (1,20)

ValueError: could not broadcast input array from shape (1,19) into shape (1,20)

我在尝试进行简单的 numpy 数组切片时不断收到此错误。很难描述这段代码,但基本上我有一个图像(按名称和属性二值化)并且我创建了一个小盒子 window (1x20),我试图用这个 [=27= 遍历每个像素] 并计算 window 中黑色像素的数量。但是在每一列的末尾(所以当我从 0 到 h 时)我想找到黑色像素的局部最小值,然后我将在这些点处使 window = 0(白色)(这虽然有点无关紧要)。

我只是在对 numpy 数组进行切片时一直出现此错误,它总是说数组的一列太短,我不知道为什么。无论如何,这是我的代码..

import scipy
import numpy as np
import cv2
from scipy.signal import argrelextrema

#%% Import grain image

imagein = cv2.imread('141110_0.35_armt_amb2_0_load_pag_0000.tif',0)
#resized = cv2.resize(imagein,None,fx=0.2,fy=0.2,interpolation =cv2.INTER_AREA)
crop = imagein[1125:1200,1100:1185]
HC = cv2.equalizeHist(crop)
ret, thresh = cv2.threshold(HC,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
thresh = 255- thresh
cv2.imshow('Image',thresh)
cv2.waitKey(0)
cv2.destroyAllWindows() 

#%% Cropped thresholded Image --> Start segmentation

binarised = cv2.erode(thresh,None,iterations = 1)
binarised = cv2.dilate(binarised,None,iterations = 1)  # Opening of particles

h,w = binarised.shape

#%% Start separation loop

windowH = np.zeros(shape=(1,20))
NumNonZero = np.zeros(shape=(h,w))

#windowV = np.zeros(shape=(20,1))


for j in np.arange(0,w,1):
    for i in np.arange(0,h,1):
        windowH[:,:] = binarised[i:i+1,j:j+20] #####ERRROR HERE
        NumNonZero[i,j] = cv2.countNonZero(windowH)

x = argrelextrema(NumNonZero[i,0:h], np.less)  #gives position of min vlaues in array
y = NumNonZero[argrelextrema(NumNonZero[i,0:h], np.less)[0]] #gives min values'

我已经突出显示了错误所在(在双 for 循环中)。任何帮助表示感谢!!!!

很明显,windowH 是 1x20,而我尝试输入的 'binarised' 块也是 1x20,但它说它是 1x 19!???!¬?

########## 重新发布

现在我创建的这个函数有一个非常相似的错误,除了这次错误是:

ValueError:无法将输入数组从形状 (2,3,3) 广播到形状 (3,3,3)

这是我的代码...我已经尝试减少外观中的迭代次数,这样 window 就不会尝试用图像之外的值填充自身,但它仍然无法正常工作。有什么建议么?谢谢。

#%% Import Libraries
import numpy as np
import cv2

#%% 3D Median Filter Function

def Median_Filter_3D(image,kernel):

    window = np.zeros(shape=(kernel,kernel,kernel), dtype = np.uint8)
    n = (kernel-1)/2    #Deals with Image border
    imgout = np.empty_like(image)
    w,h,l = image.shape

#Start Loop over each pixel

    for x in np.arange(0,(h-kernel-3),1):
        for y in np.arange(0,(w-kernel-3),1):
            for z in np.arange(0,(l-kernel-3),1):
                window[:,:,:] = image[x:x+kernel,y:y+kernel,z:z+kernel]
                med = np.median(window)
                imgout[x+n,y+n,z+n] = med 
    return(imgout)

j 的 for 循环的范围应为 0 到 w-20。否则 j+20 将超过图像的宽度,导致它在最后裁剪它。