Оптимизация обработки изображений в PythonPython

Программы на Python
Ответить
Anonymous
 Оптимизация обработки изображений в Python

Сообщение Anonymous »

Я столкнулся с проблемой скорости работы одной из моих функций:
идея состоит в том, чтобы упростить цветной рисунок (сделанный в procreate) для последующего обнаружения контуров.
Во-первых, я do K означает найти значения RGB основных цветов рисунка.
Затем я передаю функцию очистки, чтобы «очистить» изображение и преобразовать все пиксели, которые не являются основным цветом, в ближайший основной цвет RGB.
/>Это было довольно быстро, но делало странные вещи. Действительно, например, между светло-синим и черным цветами у меня были темно-синие цвета, которых обычно не было сначала.
вот пример обработки изображения «до после» с
до
после обработки изображения (появляется средний синий цвет, поскольку это другой основной цвет)
Затем я решил проверить только локально вокруг пикселя на наличие основных цветов, а затем выбрать ближайший к RGB. Я даже могу обработать область размером 25 на 25 пикселей, и если есть вариант увеличения до 5 на 5 пикселей, но это не быстрее.
Кроме того, этот метод требует гораздо больше ресурсов, и мои изображения занимают много времени. возраст для обработки.
На моем компьютере (R7 6800H и RTX 3060) обработка изображения размером 1000x2000 пикселей занимает примерно 3 минуты.
Обработка изображения (милый кот, которого я сделал)
Вот что я на самом деле ищу в результате:
цель
Вот код моей функции ниже.
Есть ли способ повысить эффективность? Мне не хватает библиотеки или более простого способа сделать это?
Спасибо за помощь :)
def clean_image_optimized(image_np, clustered_image, main_colors_rgb):

print("Start Time:", datetime.datetime.now())

#prepare data
cleaned_image = np.copy(clustered_image)
total_pixels = image_np.shape[0] * image_np.shape[1]
block_size = 5 # Initial block size for the first pass
region_size = 5 # Neighborhood size for detailed checking

main_colors_set = set(tuple(color) for color in main_colors_rgb)

#first check in larg blocks
for y in range(0, image_np.shape[0], block_size):
for x in range(0, image_np.shape[1], block_size):

#block region
y_max = min(image_np.shape[0], y + block_size)
x_max = min(image_np.shape[1], x + block_size)
block = image_np[y:y_max, x:x_max, :3]

# Check if the block is homogeneous (all pixels are the same)
unique_colors_in_block = np.unique(block.reshape(-1, 3), axis=0)

if all(tuple(color) in main_colors_set for color in unique_colors_in_block):

#entire block composed main color, continue without modification
continue
else:
#check more precisely
for i in range(y, y_max):
for j in range(x, x_max):
pixel_color = image_np[i, j, :3]
if tuple(pixel_color) not in main_colors_set:

y_min, y_max_i = max(0, i - region_size), min(image_np.shape[0], i + region_size)
x_min, x_max_j = max(0, j - region_size), min(image_np.shape[1], j + region_size)
region = clustered_image[y_min:y_max_i, x_min:x_max_j]
region_flat = region.reshape(-1, 3)
unique, counts = np.unique(region_flat, axis=0, return_counts=True)
dominant_color = unique[np.argmax(counts)]
cleaned_image[i, j] = dominant_color

print("End Time:", datetime.datetime.now())

return cleaned_image


Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»