#python #list #parameters
#python #Список #параметры
Вопрос:
Я написал функцию, которая принимает в качестве параметра 3 целых числа, поскольку мне задано три пикселя, и мне нужно вернуть пиксель с наименьшим расстоянием от средних значений красного, зеленого и синего по всем пикселям.
def get_best_pixel(pixel1, pixel2, pixel3):
red_average = (pixel1.red pixel2.red pixel3.red) // 3
green_average = (pixel1.green pixel2.green pixel3.green) // 3
blue_average = (pixel1.blue pixel2.blue pixel3.blue) // 3
pixel1_dist = get_pixel_dist(pixel1, red_average, green_average, blue_average)
pixel2_dist = get_pixel_dist(pixel2, red_average, green_average, blue_average)
pixel3_dist = get_pixel_dist(pixel3, red_average, green_average, blue_average)
if pixel1_dist <= pixel2_dist and pixel1_dist <= pixel3_dist:
return pixel1
elif pixel3_dist <= pixel1_dist and pixel3_dist <= pixel2_dist:
return pixel3
elif pixel2_dist <= pixel1_dist and pixel2_dist <= pixel3_dist:
return pixel2
но я хочу преобразовать функцию, чтобы она вместо этого принимала эти целые числа из списка:
def get_best_pixel(pixel_list):
pixel_list = []
Кстати, я использую SimpleImage.
Комментарии:
1. Что вы подразумеваете под «таким образом, каждый пиксель в списке может быть принят с 3 значениями RGB» — каждый пиксель будет иметь только одно значение R, G и B, не так ли?
2. @Grismar да, я имел в виду 3 значения, по одному для красного, зеленого и синего
3. Списки работают как параметр так же, как и другие переменные, просто используйте их внутри функции. Что вы делаете со своим двойником
/
?4. Я не понял, в чем заключается ваш вопрос.
Ответ №1:
Определите функцию расстояния между двумя пикселями:
def dist(p1, p2):
return (
(p1.red - p2.red)**2
(p1.green - p2.green)**2
(p1.blue - p2.blue)**2
)**0.5
«Лучший» пиксель минимизирует расстояние до среднего пикселя:
from dataclasses import dataclass
from statistics import mean
@dataclass
class RgbPixel:
red: int
green: int
blue: int
def best(pixels):
avg = RgbPixel(
int(mean(p.red for p in pixels)),
int(mean(p.green for p in pixels)),
int(mean(p.blue for p in pixels)),
)
return min(pixels, key=lambda p: dist(p, avg))
Комментарии:
1. Это концептуально лучший ответ, хотя он игнорирует использование
SimpleImage
, которое может уже иметь структуры данных, подобныеRgbPixel
определенному здесь, которые затем было бы предпочтительнее использовать.2. @Grimar Я быстро взглянул на исходный код этой библиотеки, и мне показалось
Pixel
, что классу требуется ссылка на базовое изображение. github.com/adilu/simpleimage/blob/master/simpleimage/Pixel.py Короче говоря, автору библиотеки, вероятно, следует провести небольшой рефакторинг. 😉
Ответ №2:
ваш список пикселей должен выглядеть примерно так. [[пиксель1.красный, пиксель1.зеленый, пиксель1.синий],[пиксель2.красный, пиксель2.зеленый, пиксель2.синий],[пиксель3.красный, пиксель3.зеленый, пиксель3.синий]]
итак, если вы передаете значения функции в этом формате, вы можете получить его, используя pixel_list[1] [0] и так далее..
Ответ №3:
-
Если вы могли бы передать список при вызове функции, то выполните следующие действия:
class Pixel: pass def fun(a): print(a) print(type(a)) fun([Pixel(), Pixel(), Pixel()])
Вывод:
[<__main__.Pixel instance at 0x7f1688e4e5f0>, <__main__.Pixel instance at 0x7f1688e4e680>, <__main__.Pixel instance at 0x7f1688e4e6c8>] <type 'list'>
-
Если вы все еще хотите вызывать функцию с одним параметром один за другим, то:
def fun2(*b): bb = list(b) print(bb) print(type(bb)) fun2(Pixel(), Pixel(), Pixel())
Вывод:
[<__main__.Pixel instance at 0x7f1688e4e5f0>, <__main__.Pixel instance at 0x7f1688e4e680>, <__main__.Pixel instance at 0x7f1688e4e6c8>] <type 'list'>
Ответ №4:
Вы можете использовать statictics.mean
из всех red
значений, сделайте то же самое для green
и blue
from statistics import mean
def get_best_pixel_list(pixel_list):
red_average = mean([p.red for p in pixel_list])
green_average = mean([p.green for p in pixel_list])
blue_average = mean([p.blue for p in pixel_list])
Вручную
red_average = sum((p.red for p in pixel_list)) / len(pixel_list)
Комментарии:
1. Похоже, этот модуль был выпущен в стандартную библиотеку Python в версии 3.4
2. @MateenUlhaq я добавил