Форум программистов, компьютерный форум, киберфорум
Python: Flask
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 21.05.2019
Сообщений: 9

Matplotlib.Flask. Вывод среднего значения цвета графика по вертикали и горизонтали

23.06.2022, 14:56. Показов 2554. Ответов 3

Студворк — интернет-сервис помощи студентам
Сейчас требуется:
- создать функцию для вывода графика среднего значения цвета по вертикали и горизонтали.

Ну и по возможности гляньте код, может что переделать нужно, дорабать

Полный текст задания:
Кликните здесь для просмотра всего текста
1. Веб-приложение должно менять цветовые карты изображения r, g, b в соответствии
с заданным пользователем порядком( выполнено ),
2. выдавать графики распределения цветов исходной картинки( выполнено )
3. и графики среднего значения цвета по вертикали и горизонтали.


Помогите добить работу

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
from flask import Flask, render_template, request, redirect, url_for
from flask_wtf import FlaskForm
from werkzeug.utils import secure_filename
from wtforms import FileField, SubmitField, SelectField
from wtforms.validators import DataRequired
from flask_wtf.file import FileRequired, FileAllowed
import os
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
 
app = Flask(__name__)
app.debug = True
app.config['SECRET_KEY'] = os.urandom(12).hex()
 
 
class ColorForm(FlaskForm):
    img1 = FileField("Upload image", validators=[FileRequired(), FileAllowed(['jpg', 'jpeg', 'png'], 'Images only!')])
    submit = SubmitField("Submit", validators=[DataRequired()])
    choosing_colormaps = SelectField("Choosing_colormaps",
                                     choices=[("hot", "hot"), ("Blues", "Blues"), ("cool", "cool"), ("BuGn", "BuGn"),
                                              ("Dark2", "Dark2")],
                                     validators=[DataRequired()])
 
#меняет цветовую карту изображения
def color_pics(path, choosing_colormaps):
    image = Image.open(path)
    np_image = np.array(image)
    plt.imshow(np_image[:, :, 1], cmap=choosing_colormaps)
    plt.colorbar(orientation='horizontal')
    plt.savefig('./static/images/new_image.jpg')
    plt.close()
 
 
def color_map(path):
    #  Создаем форму. В случае успешной валидации, переходим на страницу с результатом
    image = Image.open(path)
    # трансформируем изображение в numpy массив
    np_image = np.array(image)
    # транспонируем, чтобы получить доступ к значениям RGB
    image_transposed = np_image.transpose()
    # создаем массивы и записываем в них количество значений для каждой величины R, G и B
    rgb = [[]] * 3
    for i in range(3):
        rgb[i], bin = np.histogram(image_transposed[i], bins=256)
    # создаем график по получившимся данным и сохраняем его в виде изображения
    fig = plt.figure(figsize=(4, 4))
    viewer = fig.add_subplot(1, 1, 1)
    viewer.plot(rgb[0], color='r')
    viewer.plot(rgb[1], color='g')
    viewer.plot(rgb[2], color='b')
    fig.savefig(f'./static/images/color_map.jpg')
    plt.close()
    return 0
 
 
# главная страница приложения
@app.route("/", methods=["GET", "POST"])
def index():
    # очищаем папку static от файлов, загруженных в прошлой сессии
    files = os.listdir("./static/images/")
    if len(files) > 1:
        for file_path in files:
            if file_path != 'style.css':
                os.remove('./static/images/' + file_path)
    #  Создаем форму. В случае успешной валидации, переходим на страницу с результатом
    form = ColorForm()
 
    if form.validate_on_submit():
        choosing_colormaps = form.choosing_colormaps.data
 
    if form.validate_on_submit():  # возвращает True, когда форма была отправлена и данные были приняты всеми валидаторами полей
 
        filename = os.path.join('./static/images', secure_filename(form.img1.data.filename))
        form.img1.data.save(filename)
        color_map(filename)
 
        color_pics(filename, choosing_colormaps)
        return redirect(url_for("result", image1=filename))
 
    return render_template("index.html", form=form)
 
 
@app.route("/result", methods=["GET"])
def result():
    # получаем названия файла и нужную форму из параметров функции redirect
    image1_path = request.args.get('image1')
    return render_template("result.html", image1=image1_path)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.06.2022, 14:56
Ответы с готовыми решениями:

Matplotlib возможно ли сделать виджет регулирующий масштаб по горизонтали с авто масштабированием по вертикали
Мне нужно регулировать ползунком масштаб графика по горизонтали и чтобы он при ручной прокрутке подстраивался по высоте(не было пустого...

Подставные значения данных по вертикали и горизонтали
Добрый день, Передо мной встала задача,составить калькулятор услуг,но вот загвоздка в том,что мой уровень в exel недоначинающий. Честно,...

Расположить три фишки своего цвета в один ряд по вертикали, горизонтали или диагонали быстрее противника.
Ігрове поле - це 16 клітин (4х4). Кожен з гравців ставить свої чотири фішки по обидва боки поля, через одну з фішками противника, як...

3
0 / 0 / 0
Регистрация: 21.05.2019
Сообщений: 9
27.07.2022, 13:09  [ТС]
Рабочий код.
Может кому пригодится

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import app as app
import cv2
from flask import Flask, render_template, request, redirect, url_for
from flask_wtf import FlaskForm, RecaptchaField
from werkzeug.utils import secure_filename
from wtforms import FileField, SubmitField, SelectField
from wtforms.validators import DataRequired
from flask_wtf.file import FileRequired, FileAllowed
import os
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
 
app.debug = True
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(12).hex()
 
 
class ColorForm(FlaskForm):
    img1 = FileField("Upload image", validators=[FileRequired(), FileAllowed(['jpg', 'jpeg', 'png'], 'Images only!')])
    submit = SubmitField("Submit", validators=[DataRequired()])
    choosing_colormaps = SelectField("Choosing_colormaps",
                                     choices=[("hot", "hot"), ("Blues", "Blues"), ("cool", "cool"), ("BuGn", "BuGn"),
                                              ("Dark2", "Dark2")],
                                     validators=[DataRequired()])
    recaptcha = RecaptchaField()
 
 
# меняет цветовую карту изображения
def color_pics(path, choosing_colormaps):
    image = Image.open(path)  # открываем изображение
    np_image = np.array(image)  # трансформируем в numpy массив
    plt.imshow(np_image[:, :, 1], cmap=choosing_colormaps)  # преобразуем изображение в 2D массив.
    plt.colorbar(orientation='vertical')  # цветовая шкала
    plt.title('', text=choosing_colormaps)  # название использованной цветовой карты
    plt.axis("off")  # убираем ось
    plt.savefig('./static/images/color_pics.jpg')  # сохраняем рисунок
    plt.close()  # закрываем, иначе при дальнейшем работе кода рисунок будет накладываться на другие.
 
 
def color_map(path):
    #  Создаем форму. В случае успешной валидации, переходим на страницу с результатом
    image = Image.open(path)
    # трансформируем изображение в numpy массив
    np_image = np.array(image)
    # транспонируем, чтобы получить доступ к значениям RGB
    image_transposed = np_image.transpose()
    # создаем массивы и записываем в них количество значений для каждой величины R, G и B
    rgb = [[]] * 3
    for i in range(3):
        rgb[i], bin = np.histogram(image_transposed[i], bins=256)
    # создаем график по получившимся данным и сохраняем его в виде изображения
    fig = plt.figure(figsize=(4, 4))
    # Separate Graph for each color
    plt.plot(rgb[0], color='red', linestyle='solid',
             marker='o', markerfacecolor='red', markersize=1)
    plt.plot(rgb[1], color='green', linestyle='solid', linewidth=1,
             marker='o', markerfacecolor='green', markersize=1)
    plt.plot(rgb[2], color='blue', linestyle='solid', linewidth=1,
             marker='o', markerfacecolor='blue', markersize=1)
    # именуем сторону x
    plt.xlabel('x - axis')
    # именуем сторону y
    plt.ylabel('y - axis')
    plt.axis('tight')
    # даём название графику
    plt.title('График распределения цветов!')
    fig.savefig(f'./static/images/color_map.jpg', bbox_inches='tight')
    plt.close()
    return 0
 
 
def average_color_image(path):
    image_bgr = cv2.imread(path, cv2.IMREAD_COLOR)
    # Вычисляем среднее значение каждого канала BGR
    rgb = cv2.mean(image_bgr)
    # Вычисляем среднее значение каждого канала RGB
    observation = np.array([(rgb[0], rgb[1], rgb[2])])
    # Показать среднее значение канала
    observation
    # Показать изображение
    plt.imshow(observation), plt.axis("off")
    # даём название графику
    plt.title('Average color image')
    plt.savefig(f'./static/images/average_color_image.jpg')
    plt.show()
 
 
def average_color_graph(path):
    # Вычисляем среднее значение каждого канала
    image_rgb = cv2.imread(path, cv2.IMREAD_COLOR)
    rgb = cv2.mean(image_rgb)
    np.array([(rgb[0], rgb[1], rgb[2])])
    # Выводим значения для каждого цвета R G B
    plt.plot(rgb[0], color='red', marker='o', markersize=8)
    plt.plot(rgb[1], color='green', marker='o', markersize=8)
    plt.plot(rgb[2], color='blue', marker='o', markersize=8)
    # подписи
    plt.xlabel('horizontal')
    plt.ylabel('vertical')
    # название изображения
    plt.title('Average color graph')
    plt.savefig(f'./static/images/average_color_graph.jpg')
    plt.show()
    plt.close()
 
 
# главная страница приложения
@app.route("/", methods=["GET", "POST"])
def index():
    # очищаем папку static от файлов, загруженных в прошлой сессии
    files = os.listdir("./static/images/")
    if len(files) > 1:
        for file_path in files:
            if file_path != 'style.css':
                os.remove('./static/images/' + file_path)
    #  Создаем форму. В случае успешной валидации, переходим на страницу с результатом
    form = ColorForm()
 
    if form.validate_on_submit():
        choosing_colormaps = form.choosing_colormaps.data
 
    if form.validate_on_submit():  # возвращает True, когда форма была отправлена и данные были приняты всеми валидаторами полей
 
        filename = os.path.join('./static/images', secure_filename(form.img1.data.filename))
        form.img1.data.save(filename)
        color_map(filename)
        average_color_graph(filename)
        average_color_image(filename)
        color_pics(filename, choosing_colormaps)
        return redirect(url_for("result", image1=filename))
 
    return render_template("index.html", form=form)
 
 
@app.route("/result", methods=["GET"])
def result():
    # получаем названия файла и нужную форму из параметров функции redirect
    image1_path = request.args.get('image1')
    return render_template("result.html", image1=image1_path)
0
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
27.07.2022, 18:31
Цитата Сообщение от Tarakanator Посмотреть сообщение
Рабочий код.
рабочий, но неверный.
Цитата Сообщение от Tarakanator Посмотреть сообщение
графики среднего значения цвета по вертикали и горизонтали
вы так и не сделали и, похоже, не понимаете о чем идет речь.
0
0 / 0 / 0
Регистрация: 21.05.2019
Сообщений: 9
27.07.2022, 19:40  [ТС]
рабочий, но неверный.
4 из 5 заданий выполнил верно. Зачёт получил.

Если у кого похожее задание будет думаю они смогут доработать код.

Если есть желание можете доделать код для будущих поколений
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.07.2022, 19:40
Помогаю со студенческими работами здесь

Как отцентровать значения в ячейке по вертикали и горизонтали
Извините за тупой вопрос, Заранее ПАСИБО ;)

MatPlotLib вывод графика
def temp(x,h,l,k,To): #Variables pg18 a11 = 7 + (4*h*(l*l))/(5*k) a12 = (2*h*(l*l))/(5*k) - 8 a13 = 1 -...

Вывод 3D графика с отображением точек в matplotlib
Добрый день! Пытаюсь на 3D графике по примерам реализовать облако из 500 объектов. В каждом объекте 2111 признаков. X - вектора с...

Как вывести значения из графика Matplotlib в таблицу
Как вывести значения из графика Matplotlib в таблицу x и y?(пример талицы как на фото) import math import pylab # !!! Импортируем один...

Как расширить области определения и значения функции так, чтобы график был виден полностью?
Есть такой код from sympy import * var('x y') plot_implicit(Eq((x+5)**2/3+y**2, 5)) Как расширить области определения и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru