【问题标题】:tkinter - When resizing color image, it shows up in red scale onlytkinter - 调整彩色图像大小时,它仅以红色比例显示
【发布时间】:2018-02-08 15:56:30
【问题描述】:

我有以下代码:

from tkinter import *
from tkinter import filedialog
from PIL import Image, ImageTk
import cv2
import os
import glob
import numpy as np


image_path = ""
image_list = []
class Proj:
    def __init__(self, master):
        self.master = master
        #GUI height and width
        w = 1250 
        h = 600

        # open folder manager to select image folder
        image_path =  filedialog.askdirectory()

        master.geometry("%dx%d%+d%+d" % (w ,h ,0,0))
        master.resizable(True,True)

        #read in images from folder
        self.read_images(master, image_path)
        #cv2.imshow('image',cv2.imread(image_list[0], 1))
        self.img = cv2.imread(image_list[0])

        self.img = Image.fromarray(np.array(self.img).copy())
        self.img.thumbnail((w//2, w//2+10))
        self.img = ImageTk.PhotoImage(self.img)


        image_frame = Frame(master)
        image_frame.grid(row = 0, column = 0, columnspan = 3, rowspan = 5)
        left_panel = Canvas(image_frame, width=w//2, height=h-70)
        left_panel.grid(row=0, column=0, columnspan=4)      
        imgA_handler = left_panel.create_image((0,0), image = self.img, anchor="nw")

        right_panel = Canvas(image_frame, width=w//2, height=h-70)
        right_panel.grid(row=0, column=5, columnspan=4)

    def read_images(self, master, path):
        images = path + '/*.tif'
        for img in glob.glob(images): #will only read in tif images
            image_list.append(img)

root = Tk()     
example = Proj(root)
root.mainloop()

我正在阅读彩色 .tif 图像,然后尝试在 left_panel. 中显示它们但是,当我这样做时,它 仅以红色显示正常彩色图像规模即使虽然我从来没有只提取红色信号。我完全无法诊断问题。我该如何解决这个问题?

最终,我想做的是在这个 GUI 上显示两个图像。左边是原始图像,右边是修改后的图像。目前,我的 gui 布局已按照我上面的编码进行设置。但是,如果您认为有更简单的方法可以做到这一点,那么我很想听听。

【问题讨论】:

标签: python user-interface opencv tkinter


【解决方案1】:

这是因为 opencv 使用 BGR 而不是 RGB。当您使用此行时:self.img = Image.fromarray(np.array(self.img).copy()) 正在交换蓝色和红色。就在你使用上面的代码之前,在 opencv 中将 BGR 转换为 RGB 就可以了。

self.img = cv2.cvtColor(self.img,cv2.COLOR_BGR2RGB)

【讨论】:

    【解决方案2】:

    我看到你正在使用 opencv。为什么不使用 opencv 命令来调整大小。 它非常简单,而且效果很好。

    看看这个页面:

    OpenCV Resize

    这是一个将图像缩小 50% 的示例,或者您可以放置​​所需的确切尺寸,而不是 fx 和 fy。

    thumbnail = cv2.resize(image, (0,0), fx=0.5, fy=0.5) 
    

    【讨论】:

    • 这与问题无关。问题是为什么颜色会变成红色。
    • 当我尝试这个(我注释掉了我之前的thumbnail 命令)并使用resize 时,它说src 既不是numpy 数组也不是标量。我尝试在 imread 之后立即调用此函数,结果只是打印了一堆矩阵并说不存在。
    • 你可以试试类似:import cv2image = cv2.imread("original.jpg")thumbnail = cv2.resize(image, (0,0), fx=0.5, fy=0.5)cv2.imwrite("resized.jpg", thumbnail)这对我有用,或者发布你修改过的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2017-11-06
    相关资源
    最近更新 更多