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 将超过图像的宽度,导致它在最后裁剪它。
我在尝试进行简单的 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 将超过图像的宽度,导致它在最后裁剪它。