在运行时python中修改图像

2024-10-01 00:23:53 发布

您现在位置:Python中文网/ 问答频道 /正文

实际上,我在pcduino上用python编写了一个程序,从外部板上读取电压值。我的程序运行良好,可以在控制台上打印值,但现在我想以图形方式显示这些值。在

我想做的一个例子是显示一个背景图像(从文件导入的.jpg),然后根据电压阵列的值和位置do:

  • 将图像的左侧涂成红色,而不是在控制台上的位置1打印3.3V
  • 将图像的右侧涂成红色,而不是在控制台上的位置2打印3.3V

其中,将要绘制的背景部分取决于数组索引,颜色将取决于该索引处的值(即:左侧表示索引1,右侧表示索引2;红色表示3.3V,蓝色表示2.2V,绿色表示1.1V,不修改0V)

def Setup():
    img = ImageRead('Background.jpg')
    Show(img)

def Loop():
    while(1):
        pos = pos + 1
        V[pos]=analog_read(3)*3.3/4096        #converting level to a voltage
        print "V[%d] = %f" %(pos, V[pos])     #this actually works fine
        Paintbackground(pos, V[pos])          #desired function

我的目标是让“Paintbackground”变成这样:

^{pr2}$

我看到我可以使用openCV加载和修改图像,但我没有看到任何实时升级/刷新的方法(不必关闭窗口或保存然后重新加载文件,这需要“很多时间”)。在

另外,我还看到openGL是一个库,在那里我有大量的工具来进行图形设计,但是不能加载一个.jpg文件

请注意,我没有太多的Python编程经验,而且我的水平很低(即使我花了两天时间看教程和google搜索)


Tags: 文件pos图像程序程序运行图形imgdef
3条回答

我用OpenCV创建了一些简单的示例,演示了如何在运行时修改图像。它在每次刷新时随机添加一个白点。在

import cv2
import random
import numpy as np

img = np.zeros((100,100))
cv2.startWindowThread()
while(1):
    cv2.imshow('',img)
    cv2.waitKey(25) # here you specify refresh rate in ms
    img[random.randint(0,99),random.randint(0,99)] = 255

有关更多信息,您可以搜索OpenCV文档:http://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html

下面是一个使用补丁来构建多个掩码的版本。在

from time import sleep
import matplotlib.pyplot as plt
import matplotlib.patches as patches


img = plt.imread("background.png")
img_height = 500
img_width = 800

fig, ax = plt.subplots()
ax.imshow(img)

boxwidth = img_width//3
boxheight = img_height//3

zone = {}
for x in range(3):
    for y in range(3):
        p = ax.add_patch(patches.Rectangle(
            (x*boxwidth, y*boxheight), boxwidth, boxheight,
            facecolor='green', alpha=0.5))
        zone[x*3 + y] = p


colors = {0.0: None, 1.1: 'green', 2.2: 'blue', 3.3: 'red'}

plt.axis([0, img_width, 0, img_height])
plt.show(block=False)


def paint_background(pos, val):
    c = colors[val]
    if c is None:
        zone[pos].set_alpha(0)
    else:
        zone[pos].set_alpha(0.5)
        zone[pos].set_facecolor(c)
    plt.draw()


example_sequence = [
    (1, 1.1), (2, 3.3), (1, 0.0), (2, 2.2),
    (5, 1.1), (2, 2.2), (8, 0.0), (2, 2.2)]

for (pos, val) in example_sequence:
    paint_background(pos, val)
    sleep(1)

这样可以得到如下输出:

enter image description here

由于您的目标是对控制台输出进行实时可视化,所以最好创建和修改绘图,而不是修改图像。我可以考虑以下几点。在

import matplotlib.pyplot as plt
from time import sleep

img = plt.imread("background.png")
img_height = 500    # images height in pixel
img_width = 800    # image width

fig, ax = plt.subplots()
ax.imshow(img)


right = plt.axvspan(0, img_width//2, facecolor='green', alpha=0.5)
left = plt.axvspan(img_width//2, img_width, facecolor='green', alpha=0.5)

colors = {0.0: None, 1.1: 'green', 2.2: 'blue', 3.3: 'red'}
zone = {1: left, 2: right}

plt.axis([0, img_width, 0, img_height])
plt.show(block=False)


def paint_background(pos, val):
    c = colors[val]
    if c is None:
        zone[pos].set_alpha(0)
    else:
        zone[pos].set_alpha(0.5)
        zone[pos].set_facecolor(c)
    plt.draw()

# Demonstrate how it looks like
example_sequence = [
    (1, 1.1), (2, 3.3), (1, 0.0), (2, 2.2),
    (1, 1.1), (2, 2.2), (2, 0.0), (2, 2.2)]

for (pos, val) in example_sequence:
    paint_background(pos, val)
    sleep(1)

输出看起来与下面的屏幕截图相似,颜色区域的变化如您的问题所述。在

enter image description here

使用matplotlib可以提供许多附加功能,如添加标题或设置轴描述,如果需要,还可以将绘图序列写入文件。在

相关问题 更多 >