成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Python中怎樣調(diào)整圖像大小

今天就跟大家聊聊有關(guān)Python中怎樣調(diào)整圖像大小,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

在信州等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需求定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,營(yíng)銷(xiāo)型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè)公司,信州網(wǎng)站建設(shè)費(fèi)用合理。

創(chuàng)建圖像

在這個(gè)例子中,我們將創(chuàng)建我們自己的圖像,而不是找到一個(gè)真正的圖像來(lái)操縱。

為什么?事實(shí)上,創(chuàng)造圖像是一個(gè)很好的方式來(lái)說(shuō)明一個(gè)圖像實(shí)際上是什么。這個(gè)調(diào)整大小的程序在Instagram上也同樣適用。

那么,什么是圖像?在Python數(shù)據(jù)術(shù)語(yǔ)中,圖像是int元組的列表。

image = list[list[tuple[*int, float]]]

NumPy的定義是一個(gè)二維形狀數(shù)組 (h, w, 4),其中h表示高的像素?cái)?shù)(上下),w表示寬的像素?cái)?shù)(從左到右)。

換句話說(shuō),圖像是像素列表(行)的列表(整個(gè)圖像)。每個(gè)像素由3個(gè)整數(shù)和1個(gè)可選浮點(diǎn)數(shù)組成:紅色通道、綠色通道、藍(lán)色通道、alpha(浮點(diǎn)可選)。紅色、綠色、藍(lán)色通道(RGB)的值從0到255。

從現(xiàn)在開(kāi)始,我們將討論沒(méi)有alpha通道的彩色圖像,以保持簡(jiǎn)單。Alpha是像素的透明度。圖像也只能有一個(gè)值從0到255的通道。這就是灰度圖像,也就是黑白圖像。在這里我們使用彩色圖像!

import matplotlib as plt

pixel: tuple = (200, 100, 150)
plt.imshow([[list(pixel)]])

Python中怎樣調(diào)整圖像大小

用純Python制作圖像

Python完全能夠創(chuàng)建圖像。要顯示它,我將使用matplotlib庫(kù),你可以使用它安裝:

pip install matplotlib

創(chuàng)建像素:

from dataclasses import dataclass

@dataclass
class Pixel:
  red: int
  green: int
  blue: int
  # alpha: float = 1
	
pixel = Pixel(255,0,0)
pixel
# returns: 
# Pixel(red=255, green=0, blue=0, alpha=1)

創(chuàng)建圖像:

from __future__ import annotations

from dataclasses import dataclass, astuple
from itertools import cycle
from typing import List

import matplotlib.pyplot as plt
import matplotlib.image as mpimg


@dataclass
class Pixel:
  red: int
  green: int
  blue: int
  # alpha: float = 1


pixel = Pixel(255,0,0)
pixel

marigold: Pixel = Pixel(234,162,33)
red: Pixel = Pixel(255,0,0)

Image = List[List[Pixel]]


def create_image(*colors: Pixel, blocksize: int = 10, squaresize: int = 9) -> Image:
  """ 用可配置的像素塊制作一個(gè)正方形圖像(寬度和高度相同).
  Args:
      colors (Pixel): 可迭代的顏色呈現(xiàn)順序的參數(shù)。
      blocksize (int, optional): [description]. 默認(rèn)10.
      squaresize (int, optional): [description]. 默認(rèn)9.
  Returns:
      Image: 一幅漂亮的正方形圖片!
  """
  img: list = []
  colors = cycle(colors)
  for row in range(squaresize):
    row: list = []
    for col in range(squaresize):
      color = next(colors) # 設(shè)置顏色
      for _ in range(blocksize):
        values: list[int] = list(astuple(color))
        row.append(values)
    [img.append(row) for _ in range(squaresize)] # 創(chuàng)建行高
  return img


if __name__ == '__main__':
  image = create_image(marigold, red)
  plt.imshow(image)

Python中怎樣調(diào)整圖像大小

這就是渲染的圖像。在背后,數(shù)據(jù)是這樣的:

[[[234, 162, 33],
  [234, 162, 33],
  [234, 162, 33],
  [234, 162, 33],
  [234, 162, 33],
  [234, 162, 33],
  [234, 162, 33],
  [234, 162, 33],
  [234, 162, 33],
  [234, 162, 33],
  [255, 0, 0],
  [255, 0, 0],
  [255, 0, 0],
  [255, 0, 0],
  [255, 0, 0],
  [255, 0, 0],
  [255, 0, 0],
  [255, 0, 0],
  [255, 0, 0],
  [255, 0, 0],
  [234, 162, 33],
  ...

現(xiàn)在我們有了一個(gè)圖像,讓我們調(diào)整它的大?。?/p>

在Python中調(diào)整大小

在Python中編寫(xiě)調(diào)整圖像大小的算法實(shí)際上有很多的工作量。

在圖像處理算法中有很多內(nèi)容,有些人為此貢獻(xiàn)了十分多的工作。例如重采樣——在縮小后的圖像中使用一個(gè)像素來(lái)代表周?chē)母叻直媛氏袼亍D像處理是一個(gè)巨大的話題。如果你想親眼看看,看看Pillow的Image.py,它在路徑path/to/site-packages/PIL中。

這中間還有一些優(yōu)化,比如抗鋸齒和減少間隙…這里的內(nèi)容非常多。我們是站在巨人的肩膀上,可以用一行代碼來(lái)解決我們的問(wèn)題。

如果你有興趣了解更多有關(guān)處理圖像時(shí)幕后發(fā)生的事情,我鼓勵(lì)你更多地查看“機(jī)器視覺(jué)”主題!這絕對(duì)是一個(gè)蓬勃發(fā)展的領(lǐng)域。

做得足夠好,就會(huì)有很多公司愿意為你的計(jì)算機(jī)視覺(jué)專(zhuān)業(yè)知識(shí)付出最高的代價(jià)。自動(dòng)駕駛,IOT,監(jiān)視,你命名它;所有基本上依賴于處理圖片(通常在Python或C++)。

一個(gè)很好的起點(diǎn)是查看scikit image。

OpenCV

OpenCV可以用來(lái)作圖像處理。他使用C++編寫(xiě)并移植到了Python

import cv2

def resize(fp: str, scale: Union[float, int]) -> np.ndarray:
    """ 調(diào)整圖像大小,保持其比例
    Args:
        fp (str): 圖像文件的路徑參數(shù)
        scale (Union[float, int]): 百分比作為參數(shù)。如:53
    Returns:
        image (np.ndarray): 按比例縮小的圖片
    """    
    _scale = lambda dim, s: int(dim * s / 100)
    im: np.ndarray = cv2.imread(fp)
    width, height, channels = im.shape
    new_width: int = _scale(width, scale)
    new_height: int = _scale(height, scale)
    new_dim: tuple = (new_width, new_height)
    return cv2.resize(src=im, dsize=new_dim, interpolation=cv2.INTER_LINEAR)

interpolation參數(shù)的選項(xiàng)是cv2包中提供的flags之一:

INTER_NEAREST – 近鄰插值
INTER_LINEAR – 雙線性插值(默認(rèn)使用)
INTER_AREA – 利用像素區(qū)域關(guān)系重新采樣。它可能是圖像抽取的首選方法。但是當(dāng)圖像被縮放時(shí),它類(lèi)似于INTER_NEAREST方法。
INTER_CUBIC – 一個(gè)大于4×4像素鄰域的雙三次插值
INTER_LANCZOS4 – 一個(gè)大于8×8像素鄰域的Lanczos插值

返回后:

resized = resize("checkers.jpg", 50)
print(resized.shape)
plt.imshow(resized) # 也可以使用 cv2.imshow("name", image)

Python中怎樣調(diào)整圖像大小

它做了我們所期望的。圖像從900像素高,900像素寬,到450×450(仍然有三個(gè)顏色通道)。因?yàn)镴upyter Lab的matplotlib著色,上面的屏幕截圖看起來(lái)不太好。

Pillow

pillow庫(kù)在Image類(lèi)上有一個(gè)調(diào)整大小的方法。它的參數(shù)是:

size: (width, height)
resample: 默認(rèn)為BICUBIC. 重采樣算法需要的參數(shù)。
box: 默認(rèn)為None。為一個(gè)4元組,定義了在參數(shù)(0,0,寬度,高度)內(nèi)工作的圖像矩形。
reducing_gap: 默認(rèn)為None。重新采樣優(yōu)化算法,使輸出看起來(lái)更好。

以下是函數(shù):

from PIL import Image

def resize(fp: str, scale: Union[float, int]) -> np.ndarray:
    """ 調(diào)整圖像大小,保持其比例
    Args:
        fp (str): 圖像文件的路徑參數(shù)
        scale (Union[float, int]): 百分比作為參數(shù)。如:53
    Returns:
        image (np.ndarray): 按比例縮小的圖片
    """
    _scale = lambda dim, s: int(dim * s / 100)
    im = Image.open(fp)
    width, height = im.size
    new_width: int = _scale(width, scale)
    new_height: int = _scale(height, scale)
    new_dim: tuple = (new_width, new_height)
    return im.resize(new_dim)

使用Pillow 的函數(shù)與OpenCV非常相似。唯一的區(qū)別是PIL.Image.Image類(lèi)具有用于訪問(wèn)圖像(寬度、高度)的屬性大小。

結(jié)果是:

resized = resize("checkers.jpg", 30.5)
print(resized.size)
resized.show("resized image", resized)

Python中怎樣調(diào)整圖像大小

請(qǐng)注意show方法如何打開(kāi)操作系統(tǒng)的默認(rèn)程序以查看圖像的文件類(lèi)型。

創(chuàng)建命令行程序

現(xiàn)在我們有了一個(gè)調(diào)整圖像大小的函數(shù),現(xiàn)在是時(shí)候讓它有一個(gè)運(yùn)行調(diào)整大小的用戶界面了。

調(diào)整一個(gè)圖像的大小是可以的。但我們希望能夠批量處理圖像。

我們將要構(gòu)建的接口將是最簡(jiǎn)單的接口:命令行實(shí)用程序。

Pallets項(xiàng)目是Flask背后的天才社區(qū),是一個(gè)Jinja模板引擎:Click(https://click.palletsprojects.com/en/7.x/。)

pip install click

Click是一個(gè)用于制作命令行程序的庫(kù)。這比使用普通的argparse或在if __name__ == '__main__':中啟動(dòng)一些if-then邏輯要好得多。所以,我們將使用Click來(lái)裝飾我們的圖像調(diào)整器。

下面是從命令行調(diào)整圖像大小的完整腳本!

""" resize.py
"""

from __future__ import annotations
import os
import glob
from pathlib import Path
import sys

import click
from PIL import Image


"""
文檔:
    https://pillow.readthedocs.io/en/5.1.x/handbook/image-file-formats.html
"""
SUPPORTED_FILE_TYPES: list[str] = [".jpg", ".png"]


def name_file(fp: Path, suffix) -> str:
    return f"{fp.stem}{suffix}{fp.suffix}"


def resize(fp: str, scale: Union[float, int]) -> Image:
    """ 調(diào)整圖像大小,保持其比例
    Args:
        fp (str): 圖像文件的路徑參數(shù)
        scale (Union[float, int]): 百分比作為參數(shù)。如:53
    Returns:
        image (np.ndarray): 按比例縮小的圖片
    """
    _scale = lambda dim, s: int(dim * s / 100)
    im: PIL.Image.Image = Image.open(fp)
    width, height = im.size
    new_width: int = _scale(width, scale)
    new_height: int = _scale(height, scale)
    new_dim: tuple = (new_width, new_height)
    return im.resize(new_dim)


@click.command()
@click.option("-p", "--pattern")
@click.option("-s", "--scale", default=50, help="Percent as whole number to scale. eg. 40")
@click.option("-q", "--quiet", default=False, is_flag=True, help="Suppresses stdout.")
def main(pattern: str, scale: int, quiet: bool):
    for image in (images := Path().glob(pattern)):
        if image.suffix not in SUPPORTED_FILE_TYPES:
            continue
        im = resize(image, scale)
        nw, nh = im.size
        suffix: str = f"_{scale}_{nw}x{nh}"
        resize_name: str = name_file(image, suffix)
        _dir: Path = image.absolute().parent
        im.save(_dir / resize_name)
        if not quiet:
            print(
                f"resized image saved to {resize_name}.")
    if images == []:
        print(f"No images found at search pattern '{pattern}'.")
        return


if __name__ == '__main__':
    main()

命令行程序從入口點(diǎn)函數(shù)main運(yùn)行。參數(shù)通過(guò)傳遞給click.option選項(xiàng):

  • pattern采用字符串形式來(lái)定位與腳本運(yùn)行的目錄相關(guān)的一個(gè)或多個(gè)圖像。--pattern="../catpics/*.png將向上一級(jí)查找catpics文件夾,并返回該文件夾中具有.png圖像擴(kuò)展名的所有文件。

  • scale接受一個(gè)數(shù)字、浮點(diǎn)或整數(shù),并將其傳遞給resize函數(shù)。這個(gè)腳本很簡(jiǎn)單,沒(méi)有數(shù)據(jù)驗(yàn)證。如果你添加到代碼中,檢查比例是一個(gè)介于5和99之間的數(shù)字(合理的縮小比例參數(shù))。你可以通過(guò)-s "chicken nuggets"進(jìn)行設(shè)置。

  • 如果不希望在程序運(yùn)行時(shí)將文本輸出到標(biāo)準(zhǔn)流,則quiet是一個(gè)選項(xiàng)參數(shù)。

從命令行運(yùn)行程序:

python resize.py -s 35 -p "./*jpg"

結(jié)果:

$ py resize.py -p "checkers.jpg" -s 90
resized image saved to checkers_90_810x810.jpg.

正在檢查文件夾:

$ ls -lh checkers*
-rw-r--r-- 1 nicho 197609 362K Aug 15 13:13 checkers.jpg
-rw-r--r-- 1 nicho 197609 231K Aug 15 23:56 checkers_90_810x810.jpg

不錯(cuò)!所以程序縮小了圖像,給了它一個(gè)描述性的標(biāo)簽,我們可以看到文件大小從362KB到231KB!

為了查看程序同時(shí)處理多個(gè)文件,我們將再次運(yùn)行它:

$ py resize.py --pattern="checkers*" --scale=20
resized image saved to checkers_20_180x180.jpg.
resized image saved to checkers_90_810x810_20_162x162.jpg.

文件系統(tǒng)輸出:

$ ll -h checkers*
-rw-r--r-- 1 nicho 197609 362K Aug 15 13:13 checkers.jpg
-rw-r--r-- 1 nicho 197609 1.8K Aug 16 00:23 checkers_20_180x180.jpg
-rw-r--r-- 1 nicho 197609 231K Aug 15 23:56 checkers_90_810x810.jpg
-rw-r--r-- 1 nicho 197609 1.8K Aug 16 00:23 checkers_90_810x810_20_162x162.jpg

只要匹配到了模式,遞歸可以處理任意數(shù)量的圖像。

Click

Click 是一個(gè)神奇的工具。它可以包裝一個(gè)函數(shù)并在一個(gè)模塊中以“正常的方式”從一個(gè)if __name__ == '__main__'語(yǔ)句運(yùn)行。(實(shí)際上,它甚至不需要這樣做;你只需定義和裝飾要運(yùn)行的函數(shù)即可),但它真正的亮點(diǎn)在于將腳本作為包安裝。

這是通過(guò)Python附帶的setuptools庫(kù)完成的。

這是我的setup.py.

from setuptools import setup

setup(
    name='resize',
    version='0.0.1',
    py_modules=['resize'],
    install_requires=[
        'click',
        'pillow',
    ],
    entry_points='''
        [console_scripts]
        resize=resize:main
    '''
)

使用以下命令生成可執(zhí)行文件/包裝包:

pip install -e .

現(xiàn)在,你可以在不使用python命令的情況下調(diào)用腳本。另外,如果你將新的可執(zhí)行文件添加到路徑中的文件夾中,你可以從計(jì)算機(jī)上的任何位置調(diào)用此程序,如resize -p *jpg -s 75

看完上述內(nèi)容,你們對(duì)Python中怎樣調(diào)整圖像大小有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

新聞名稱(chēng):Python中怎樣調(diào)整圖像大小
URL鏈接:http://jinyejixie.com/article18/ppisdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、網(wǎng)站策劃、微信小程序定制開(kāi)發(fā)、Google、小程序開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管
北宁市| 海阳市| 五台县| 木兰县| 雷山县| 卢氏县| 五原县| 濮阳市| 中宁县| 开平市| 阳曲县| 通榆县| 应城市| 年辖:市辖区| 内丘县| 自治县| 新疆| 四子王旗| 海宁市| 常宁市| 青田县| 海宁市| 大丰市| 彩票| 永寿县| 娄底市| 汕头市| 兴安盟| 留坝县| 安丘市| 肃北| 黔江区| 苏尼特左旗| 扬州市| 金堂县| 玉龙| 怀远县| 西安市| 衢州市| 天峨县| 广汉市|