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 будет превышать ширину изображения, что приведет к его обрезке в конце.

Другие вопросы по тегам