Gunterio
21.09.2022 12:49

написать код! Нужно дополнить код по условиям задания Дано: Изображение, на котором показан фрагмент звездного неба с круглой или эллиптической (овальной) черной областью. Если это эллипс, то гарантируется, что его длинная ось расположена горизонтально (то есть эллипс не будет повернут). На приведенном выше изображении черный звездолет обрисован светлым контуром, но это только для наглядности, на загруженном для обработки изображении такого контура не будет. Пиксели, затененные звездолетом, имеют идеально черный цвет (значение 0).

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

Как отлаживать: закомментируй строку с "url=input()", а вместо нее раскомментируй следующую строку. Также можно раскомментировать строку с print(wa,ha). После этого шаблон программы должен выполняться без ошибок, выводя на консоль "200 200" (размер картинки) и "0" (вместо правильного ответа). Дальше дописываешь, что нужно, и добиваешься правильного ответа. Когда все работает, переносишь готовую программу обратно в Степик, только не забудь снова закомментировать/раскомментировать нужные строки!

Подсказки и пояснения:

Картинка уже загружена в переменную photo (это объект Image из библиотеки PIL, если интересно, документацию можно легко найти в интернете).

Картинка уже преобразована в формат greyscale (градации серого), каждая точка изображения представлена числом от 0 (черная точка) до 255 (белая).

Чтобы получить яркость точки по координатам (x,y), используется вызов photo.getpixel((x,y)). Двойные скобки означают, что x и y объединены в кортеж (x,y), передаваемый в getpixel() как один параметр.

Чтобы найти максимум чего-либо, берем переменную ("текущий максимум"), назначаем ей заведомо маленькое значение. Затем в цикле каждый раз сравниваем с текущим максимумом очередное значение, и если оно больше, то заменяем текущий максимум на это значение.

Чтобы найти длину непрерывной последовательности заданных значений (например, черных точек в строке), берем переменную ("счетчик") с начальным нулевым значением и начинаем просматривать наш массив (строку изображения и т.п.). Каждый раз, когда попадается заданное значение, счетчик увеличивается на 1. Каждый раз, когда попадается любое другое значение, мы запоминаем счетчик как длину последовательности (и, если надо, используем для обновления текущего максимума), после чего его снова обнуляем (поскольку последовательность уже кончилась).

КОД:

# Это загрузка картинки, здесь ничего трогать не надо!

from PIL import Image

import requests

url = input() # для отладки замените на:

# url = "https://stepik.org/media/attachments/lesson/578362/stars1h.png"

loaded_image=Image.open(requests.get(url, stream=True).raw) #загружаем картинку

photo=loaded_image.convert(mode="L") # переводим в greyscale (тона серого)

wa, ha = photo.size # это размеры картинки (ширина и высота, соотв.)

#print(wa,ha) # раскомментируй для отладки - должен выдавать "200, 200"

# Дальше идет ваш код!

alien_ship_width = 0 # здесь должен оказаться результат

# здесь пишем, что еще требуется перед обработкой всей картинки

# ...

for y in range(ha): # цикл просмотра по строкам

# здесь пишем, что требуется перед просмотром очередной строки

# ...

for x in range(wa): # цикл просмотра точек очередной строки

pix = photo.getpixel((x,y)) # взяли точку...

# и вот тут что-то с ней делаем!

# ...

# здесь пишем, что требуется после просмотра очередной строки

# ...

print(alien_ship_width) # выводим полученный результат

Нажмите на рекламу ниже и сразу увидите ответ
Популярные вопросы:
Ответ:
даша3901
07.06.2023 10:29
Пусть b - количество быков, k - количество коров, t - количество телят.
Тогда можно составить систему уравнений
\displaystyle \left \{ {{10b+5k+0.5t=100} \atop {b+k+t=100}} \right.
Два уравнения, три неизвестных. Придется решать перебором вариантов.
Но прямой перебор - это неинтересно. Попробуем оптимизировать.
На 100 рублей можно купить максимум 100/10=10 быков, или 100/5=20 коров, или 100/0.5=200 телят. Без телят не обойтись, даже 18 коров и бык - это 19 голов, а нужно 100. Подбирать нужное количество из 200 хуже, чем из 20 или 10, поэтому сделаем замену, чтобы избавиться от t.
Из второго уравнения следует, что t=100-b-k.    (1)
Подставим значение t в первое уравнение:
10b+5k+0.5(100-b-k)=100;
10b+5k+50-0.5b-0.5k=100;
9.5b+4.5k=50;
19b+9k=100 ⇒ k=(100-19b)/9    (2)
Укрупненный алгоритм:
Перебираем b от 0 до 9 (10 нельзя, истратим все 100 рублей, а телят покупать надо!).
Для каждого b находим k по формуле (2). Если оно целочисленное, находим t по формуле (1). Решение найдено. Иначе перебор продолжается.

var
  b,k,t:integer;
  v:real;
   
begin
  for b:=0 to 9 do
    if (100-19*b) mod 9=0 then begin
      k:=(100-19*b) div 9;
      t:=100-b-k;
      Writeln('Быков ',b,', коров ',k,', телят ',t);
      break
      end;
end.

Решение
Быков 1, коров 9, телят 90
0,0(0 оценок)
Ответ:
small2005
27.04.2021 16:48
Растровое изображение — изображение, представляющее собой сетку пикселей — цветных точек (обычно прямоугольных) на мониторе, бумаге и других отображающих устройствах.

Важными характеристиками изображения являются:

Размер изображения в пикселях — может выражаться в виде количества пикселей по ширине и по высоте (800×600px, 1024×768px, 1600×1200px и т. д.) или же в виде общего количества пикселей (так изображение размером 1600×1200px состоит из 1 920 000 точек, то есть примерно 2 мегапикселя);
Количество используемых цветов или глубина цвета (эти характеристики имеют следующую зависимость: {\displaystyle N=2^{k}}, где {\displaystyle N} — количество цветов, {\displaystyle k} — глубина цвета);
Цветовое пространство (цветовая модель) — RGB, CMYK, XYZ, YCbCr и др.;
Разрешение изображения — величина, определяющая количество точек (элементов растрового изображения) на единицу площади (или единицу длины).
0,0(0 оценок)
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота