【问题标题】:cv2.resize() error: saves the same picture with different namescv2.resize() 错误:用不同的名字保存同一张图片
【发布时间】:2017-06-27 22:29:52
【问题描述】:

我是编程新手,正在尝试制作图像缩放器。我希望能够在文件名之前由用户编写自定义前缀。尺寸也可定制。

cv2.imshow() 工作正常,但 cv2.resize() 不能。如果我用 imshow 检查它,尽管有 for 循环,它只显示一张图片,然后 cv2.imwrite 只保存一张图片,其中包含所有选定图片的名称。 列表似乎没问题。

希望我清楚,代码:

def openfiles():

    global picture_original
    global file_path
    global f

    # Valid filetypes
    file_types=[("Jpeg files","*.jpg"),("PNG files","*.png"),("BMP files","*.bmp"),("all files","*.*")]

    window.filenames =  filedialog.askopenfilenames(initialdir = "/",title = "Select file",filetypes = (file_types)) # TUPLE of filepath/filenames

    #f = []

    # Creating a list from the tuple
    for pics in window.filenames:
        f.append(pics)

        f = [picture.replace('/', "\\") for picture in f]

    try:
        for picture in f:
            picture_original = cv2.imread(picture, 1)
            #cv2.imshow("Preview", picture_original)
            #cv2.waitKey(1)
    except:
        msgbox_openerror() # Error opening the file

    # Getting the filepath only from the list "f":
    file_path = f[0].rsplit("\\",1)[0]
    view_list()

def save_command():
    """
    function to save the resized pictures
    """
    global picture_resized
    global prefix
    prefix = "Resized_"
    lst_filename = []
    lst_renamed = []

    for i in f:
        #print(f)
        path,filename = os.path.split(i) # path - only filepath | filename - only filename with extension
        lst_filename.append(prefix+filename)

    for i in range(len(f)):
        lst_renamed.append(os.path.join(path, lst_filename[i]))

    for i in range(len(f)):
        picture_resized = cv2.resize(picture_original, ((int(width.get())), int(height.get())))
        cv2.imshow("Preview", picture_resized)
        cv2.waitKey(1)

    for i in lst_renamed:
        cv2.imwrite(i, picture_resized)

我希望有人有一些想法。提前谢谢!

【问题讨论】:

  • 您希望picture_originalopenfiles() 完成后包含什么内容?
  • picture_resized...循环中没有任何内容可以调整大小,这取决于i 的值——所以你基本上在相同的输入上重复同样的事情一遍又一遍。同样,在imwrite 的循环中,唯一改变的是文件名。 |如果您要处理多个文件名(并将它们存储在一个列表中),您还应该有多个图像(并将它们存储在一个列表中)。
  • 我希望 'picture_original' 和 'picture_resized' 应该是一个 numpy 数组列表。它们的类型应该是 是的,你可能与循环有关。我尝试使用 'picture_original[i]' 和类似的 'imwrite' 调整大小。
  • picture_original = cv2.imread(picture, 1) -- 这是分配给变量,而不是附加到列表。
  • 啊,你是对的。我尝试添加到列表中。

标签: python opencv cv2


【解决方案1】:

这是一个按比例调整大小并保存图像的示例

    def ResizeImage(filepath, newfileName,ratio):
        image = cv2.imread(filepath)         #Open image
        height, width = image.shape[:2]      #Shapes
        image2 = cv2.resize(image, (width/ratio, height/ratio), interpolation = cv2.INTER_AREA)
        cv2.imwrite(newfileName,image2)         #saves, True if OK
        return filepath

所以如果你打电话

image = "originalpath"
resized = ResizeImage(image,"Resized_"+image,2)
newImage = cv2.imread(resized)
cv2.imshow("new",newImage)
cv2.waitKey(1)

您应该将图像大小调整一半

【讨论】:

  • 您的答案部分正确,但如果其他人尝试“按原样”运行您的代码,则还不能作为示例。请结合 cmets 再次阅读 OP 提出的问题,并相应地修改您的答案,以获得完整的工作答案。只有这样你才能得到我的支持。审核结束。
猜你喜欢
  • 2020-04-21
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
相关资源
最近更新 更多