Оценить ближайшее логическое соотношение сторон на искаженных изображениях в Python - PullRequest
0 голосов
/ 11 декабря 2019

Хорошо, поэтому я написал программу, которая загружает случайные изображения из онлайн-источника, а затем загружает их одно за другим на мой рабочий стол Gnome в Arch Linux.

Теперь я хочу проверить их соотношение сторон и показывать только те изображения, которые соответствуют соотношению сторон моего экрана.

У меня есть следующие функции для определения соотношения сторон:

def highest_common_factor(width,height):
    """Support function to calculate the aspect ratio of a (width:height) input.
    Stolen fron online, sometimes also reffered to as the GCD value"""
    if(height==0): 
        return width 
    else: 
        return highest_common_factor(height,width%height) 

def get_current_resolution():
    """Get current screenresolution"""

    screen_resolutions = subprocess.Popen(["xrandr"], stdout=subprocess.PIPE)
    get_current_resolution = subprocess.Popen(["grep", '*'], stdin=screen_resolutions.stdout, stdout=subprocess.PIPE)
    current_resolution = get_current_resolution.communicate()[0].decode().split()[0]
    current_width = int(current_resolution.split("x")[0])
    current_height = int(current_resolution.split("x")[1])
    return current_width, current_height

def get_aspect_ratio(resolution):
    """Determine current aspect ratio"""

    width = resolution[0]
    height = resolution[1]
    gcd = highest_common_factor(width,height)
    aspect_width = width/gcd
    aspect_height = height/gcd
    return round(aspect_width), round(aspect_height)

Проблема заключается в следующем

Эти функции отлично работают, если изображение имеетидеальные размеры, например 1200: 900 , и я добавляю их в функцию get_aspect_ratio(), я получаю идеальный результат 4: 3 . Однако, если изображение менее идеальное и имеет разрешение 1200: 901 , я также получу соотношение сторон 1200: 901 .

Математически говоря, это правильно, но человек легко увидит, что на самом деле это 4: 3.

Я думал о том, как решить эту проблему, но до сих пор не нашел работающего решения. Любые идеи или идеи приветствуются!

1 Ответ

0 голосов
/ 11 декабря 2019

Ах, решил это! Благодаря этому ответу, который познакомил меня с тем фактом, что ndigits параметр round также принимает отрицательное значение.

Так что я мог бы просто сделать:

def get_aspect_ratio(resolution):
    """Determine current aspect ratio"""

    width = resolution[0]
    height = resolution[1]
    gcd = highest_common_factor(round(width,-1),round(height,-1))
    aspect_width = width/gcd
    aspect_height = height/gcd
    return round(aspect_width), round(aspect_height)

И теперь все работает отлично :)

...