ValueError: не удалось передать входной массив из фигуры (1,19) в фигуру (1,20)
Я продолжаю получать эту ошибку, когда я пытаюсь сделать простую нарезку массива. Трудно описать этот код, но в основном у меня есть изображение (в бинарном виде, по имени и свойствам), и я создал небольшое окно (1x20), я пытаюсь перебрать каждый пиксель в этом окне и подсчитать количество черных пикселей в окне Однако в конце каждого столбца (поэтому, когда я перешел от 0 к h), я хочу найти локальные минимумы черных пикселей, а затем я сделаю окно = 0 (белое) в этих точках (это немного не имеет значения хоть).
Я просто продолжаю иметь эту ошибку при нарезке пустых массивов, всегда говорится, что массив на один столбец слишком короткий, и я не знаю почему. Во всяком случае, вот мой код..
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'
Я выделил, где ошибка (в двойном цикле). Любая помощь оценена спасибо!!!!
Таким образом, ясно, что windowH - 1x20, и часть "бинаризованного", которую я пытаюсь ввести, также 1x20, но он говорит, что это 1x 19!???! ¬?
########## РЕПОСТТеперь у меня есть очень похожая ошибка с этой функцией, которую я создал, за исключением того, что на этот раз ошибка читает:
ValueError: не удалось передать входной массив из фигуры (2,3,3) в фигуру (3,3,3)
Вот мой код... Я попытался уменьшить количество итераций во внешнем виде, чтобы окно не пыталось заполнить себя значениями, которые находятся за пределами изображения, но все еще не работают. Какие-либо предложения? Спасибо.
#%% 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)
1 ответ
Ваш цикл for для j должен находиться в диапазоне от 0 до w-20. В противном случае j+20 будет превышать ширину изображения, что приведет к его обрезке в конце.