У меня есть сегментированное изображение с использованием SLI C от scipy, и для каждого суперпикселя я получаю изображение, где только этот суперпиксель окрашен, а остальная часть изображения черная. Я хочу повторять ТОЛЬКО на цветных пикселях этого суперпикселя. Я попытался использовать для l oop следующим образом:
for i in range(0,mask.shape[0]):
for j in range(0,mask.shape[1]):
x,y,z = each_segment[i][j] #gets the pixel RGB value
unique_pixel_array = [x,y,z] #creates a vector that holds those values for each pixel
if (unique_pixel_array != [0,0,0]):
print(unique_pixel_array)
Этот метод работает, однако он очень неэффективен, учитывая, что он выполняет итерацию по всему изображению, и если у меня будет большое изображение, потребуется очень долгое время для обработки каждого суперпикселя. Есть ли более быстрый и эффективный способ сделать это?
Я приложу весь код ниже, может быть, вы получите лучшее представление обо всем этом.
from skimage.segmentation import slic
from skimage.segmentation import mark_boundaries
from skimage.util import img_as_float
import matplotlib.pyplot as plt
import numpy as np
import cv2
img = cv2.imread("image.png")
segments = slic(img_as_float(img),n_segments= 7 ,slic_zero=True,sigma =5)
fig = plt.figure("Superpixels -- %d segments" % (22))
ax = fig.add_subplot(1, 1, 1)
ax.imshow(mark_boundaries(img, segments))
plt.axis("off")
plt.show()
for (sp,segVal) in enumerate (np.unique(segments)):
mask = np.zeros(img.shape[:2],dtype = "uint8")
mask[segments == segVal] = 255
each_segment = cv2.bitwise_and(img,img,mask=mask)
for i in range(0,mask.shape[0]):
for j in range(0,mask.shape[1]):
x,y,z = each_segment[i][j]
unique_pixel_array = [x,y,z]
print(unique_pixel_array)
cv2.imshow("Mask", mask)
cv2.imshow("Applied", cv2.bitwise_and(img, img, mask = mask))
cv2.waitKey(0)