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

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

23.06.2022, 14:56. Показов 2651. Ответов 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
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
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
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru