Numpy Array (görüntü) üzerinde yineleme yapmak için parçalara nasıl bölünür? [çiftleme]

Jan 04 2021

Üzerinde yineleyebileceğim 9 (3 x 3) döşemelere bile bölmek istediğim Numpy Array tipi bir görüntüm var. Bunu nasıl yapabilirim?

Numpy.ndarray'i oluşturmak için şimdiye kadarki kodum ama bölmeyi başaramadım:

Bölünecek uyuşmuş görüntü dizisi th1

import cv2
import numpy as np

# Only for the threshold display
from matplotlib import pyplot as plt

# The Image to be used
image = 'six.png'

# Finding the average greyscale value
image_bgr = cv2.imread(image, cv2.IMREAD_COLOR)

# Calculate the mean of each channel
channels = cv2.mean(image_bgr)
# Type Float
thresh = channels[0]/2
#print (thresh)

# Displaying the threshold value
img = cv2.imread(image,0)
img = cv2.medianBlur(img,5)

# If below then black else white 
ret,th1 = cv2.threshold(img,thresh,255,cv2.THRESH_BINARY)


titles = ['Original Image', 'Global Thresholding']
images = [img, th1, ret]

for i in range(2):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

# Shows single image on its' own
plt.imshow(images[1], 'gray')
plt.xticks([]),plt.yticks([])

İşte resim (six.png):

Yanıtlar

2 GrgurDamiani Jan 04 2021 at 18:57

Yapacağım şey, tam görüntünün "parçalarını" içine kaydedeceğim bir liste veya 2 boyutlu bir dizi oluşturmaktır. Kutucuklar aşağıdaki kod kullanılarak kopyalanacaktır:

height, width, dim = img.shape
image_tile = img[0:height/3, 0:width/3]

Koordinatların içindeki tam görüntü dizisinin bir bölümünü içeren yeni bir ndarray image_tile oluşturur . Bu durumda, sol üst kiremittir.

Bir for döngüsüne sahip tüm örnek şuna benzer:

image_tile = []
for i in range(0,3):
    for j in range(0,3):
        image_tile.append(img[i * height/3:(i+1) * height/3, j * width/3:(j+1) * width/3])

Umarım bu yardımcı olur ve iyi şanslar!

1 Aiyush Jan 04 2021 at 19:31

Başka bir yerden uyarlanmış bir çözüm buldum ve harika çalışıyor!

img = th1
numrows, numcols = 3, 3
height = int(img.shape[0] / numrows)
width = int(img.shape[1] / numcols)
for row in range(numrows):
    for col in range(numcols):
        y0 = row * height
        y1 = y0 + height
        x0 = col * width
        x1 = x0 + width
        individual =  (img[y0:y1, x0:x1])
        plt.imshow(individual, 'gray')
        plt.xticks([]),plt.yticks([])
        plt.show()