Làm thế nào để chia một Mảng Numpy (hình ảnh) thành các ô để lặp lại? [bản sao]

Jan 04 2021

Tôi có một hình ảnh kiểu Numpy Array mà tôi muốn chia thành 9 (3 x 3) ô chẵn mà tôi có thể lặp lại. Tôi có thể làm cái này như thế nào?

Đây là mã của tôi cho đến nay để tạo numpy.ndarray nhưng tôi chưa tách được nó:

Mảng hình ảnh numpy cần tách là 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([])

Đây là hình ảnh (six.png):

Trả lời

2 GrgurDamiani Jan 04 2021 at 18:57

Những gì tôi sẽ làm là tạo một danh sách hoặc một mảng 2 chiều, trong đó tôi sẽ lưu các "ô" của hình ảnh đầy đủ. Các ô sẽ được sao chép bằng mã bên dưới:

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

Nó tạo ra một ndarray mới image_tile có chứa một phần của mảng hình ảnh đầy đủ đó là bên trong các tọa độ. Trong trường hợp này, nó là ô trên cùng bên trái.

Toàn bộ ví dụ với vòng lặp for sẽ trông giống như sau:

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])

Tôi hy vọng điều này có thể giúp ích, chúc bạn may mắn!

1 Aiyush Jan 04 2021 at 19:31

Tôi đã tìm thấy một giải pháp được điều chỉnh từ nơi khác và nó hoạt động rất tốt!

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()