电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

如何使用Python調整圖像大小

瀏覽:7日期:2022-07-10 08:47:46

作者|Nicholas Ballard編譯|VK來源|Towards Data Science

可以說,每一個“使用計算機的人”都需要在某個時間點調整圖像的大小。MacOS的預覽版可以做到,WindowsPowerToys也可以。

本文使用Python來調整圖像大小,幸運的是,圖像處理和命令行工具是Python的兩個特長。

本文旨在向你展示三件事:

圖像的基本概念。 用于操作圖像的Python庫。 你可以在自己的項目中使用本文的代碼。

我們要構建的命令行程序可以一次調整一個或多個圖像文件的大小。

創建圖像

在這個例子中,我們將創建我們自己的圖像,而不是找到一個真正的圖像來操縱。

為什么?事實上,創造圖像是一個很好的方式來說明一個圖像實際上是什么。這個調整大小的程序在Instagram上也同樣適用。

那么,什么是圖像?在Python數據術語中,圖像是int元組的列表。

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

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

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

從現在開始,我們將討論沒有alpha通道的彩色圖像,以保持簡單。Alpha是像素的透明度。圖像也只能有一個值從0到255的通道。這就是灰度圖像,也就是黑白圖像。在這里我們使用彩色圖像!

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

如何使用Python調整圖像大小

用純Python制作圖像

Python完全能夠創建圖像。要顯示它,我將使用matplotlib庫,你可以使用它安裝:

pip install matplotlib

創建像素:

from dataclasses import dataclass@dataclassclass 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)

創建圖像:

from __future__ import annotationsfrom dataclasses import dataclass, astuplefrom itertools import cyclefrom typing import Listimport matplotlib.pyplot as pltimport matplotlib.image as mpimg@dataclassclass Pixel: red: int green: int blue: int # alpha: float = 1pixel = Pixel(255,0,0)pixelmarigold: 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: ''' 用可配置的像素塊制作一個正方形圖像(寬度和高度相同). Args: colors (Pixel): 可迭代的顏色呈現順序的參數。 blocksize (int, optional): [description]. 默認10. squaresize (int, optional): [description]. 默認9. Returns: Image: 一幅漂亮的正方形圖片! ''' img: list = [] colors = cycle(colors) for row in range(squaresize): row: list = [] for col in range(squaresize): color = next(colors) # 設置顏色 for _ in range(blocksize): values: list[int] = list(astuple(color)) row.append(values) [img.append(row) for _ in range(squaresize)] # 創建行高 return imgif __name__ == ’__main__’: image = create_image(marigold, red) plt.imshow(image)

如何使用Python調整圖像大小

這就是渲染的圖像。在背后,數據是這樣的:

[[[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], ...

在Python中調整大小

在Python中編寫調整圖像大小的算法實際上有很多的工作量。

在圖像處理算法中有很多內容,有些人為此貢獻了十分多的工作。例如重采樣——在縮小后的圖像中使用一個像素來代表周圍的高分辨率像素。圖像處理是一個巨大的話題。如果你想親眼看看,看看Pillow的Image.py,它在路徑path/to/site-packages/PIL中。

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

如果你有興趣了解更多有關處理圖像時幕后發生的事情,我鼓勵你更多地查看“機器視覺”主題!這絕對是一個蓬勃發展的領域。做得足夠好,就會有很多公司愿意為你的計算機視覺專業知識付出最高的代價。自動駕駛,IOT,監視,你命名它;所有基本上依賴于處理圖片(通常在Python或C++)。

一個很好的起點是查看scikit image。

OpenCV

OpenCV可以用來作圖像處理。他使用C++編寫并移植到了Python

import cv2def resize(fp: str, scale: Union[float, int]) -> np.ndarray: ''' 調整圖像大小,保持其比例 Args: fp (str): 圖像文件的路徑參數 scale (Union[float, int]): 百分比作為參數。如: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參數的選項是cv2包中提供的flags之一:

INTER_NEAREST ? 近鄰插值INTER_LINEAR ? 雙線性插值(默認使用)INTER_AREA ? 利用像素區域關系重新采樣。它可能是圖像抽取的首選方法。但是當圖像被縮放時,它類似于INTER_NEAREST方法。INTER_CUBIC ? 一個大于4×4像素鄰域的雙三次插值INTER_LANCZOS4 ? 一個大于8×8像素鄰域的Lanczos插值

返回后:

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

如何使用Python調整圖像大小

它做了我們所期望的。圖像從900像素高,900像素寬,到450×450(仍然有三個顏色通道)。因為Jupyter Lab的matplotlib著色,上面的屏幕截圖看起來不太好。

Pillow

pillow庫在Image類上有一個調整大小的方法。它的參數是:

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

以下是函數:

from PIL import Imagedef resize(fp: str, scale: Union[float, int]) -> np.ndarray: ''' 調整圖像大小,保持其比例 Args: fp (str): 圖像文件的路徑參數 scale (Union[float, int]): 百分比作為參數。如: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 的函數與OpenCV非常相似。唯一的區別是PIL.Image.Image類具有用于訪問圖像(寬度、高度)的屬性大小。

結果是:

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

如何使用Python調整圖像大小

請注意show方法如何打開操作系統的默認程序以查看圖像的文件類型。

創建命令行程序

現在我們有了一個調整圖像大小的函數,現在是時候讓它有一個運行調整大小的用戶界面了。

調整一個圖像的大小是可以的。但我們希望能夠批量處理圖像。

我們將要構建的接口將是最簡單的接口:命令行實用程序。

Pallets項目是Flask背后的天才社區,是一個Jinja模板引擎:Click(https://click.palletsprojects...。)

pip install click

Click是一個用于制作命令行程序的庫。這比使用普通的argparse或在if __name__ == ’__main__’:中啟動一些if-then邏輯要好得多。所以,我們將使用Click來裝飾我們的圖像調整器。

下面是從命令行調整圖像大小的完整腳本!

''' resize.py'''from __future__ import annotationsimport osimport globfrom pathlib import Pathimport sysimport clickfrom 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: ''' 調整圖像大小,保持其比例 Args: fp (str): 圖像文件的路徑參數 scale (Union[float, int]): 百分比作為參數。如: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}’.') returnif __name__ == ’__main__’: main()

命令行程序從入口點函數main運行。參數通過傳遞給click.option選項:

pattern采用字符串形式來定位與腳本運行的目錄相關的一個或多個圖像。--pattern='../catpics/*.png將向上一級查找catpics文件夾,并返回該文件夾中具有.png圖像擴展名的所有文件。 scale接受一個數字、浮點或整數,并將其傳遞給resize函數。這個腳本很簡單,沒有數據驗證。如果你添加到代碼中,檢查比例是一個介于5和99之間的數字(合理的縮小比例參數)。你可以通過-s 'chicken nuggets'進行設置。 如果不希望在程序運行時將文本輸出到標準流,則quiet是一個選項參數。

從命令行運行程序:

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

結果:

$ py resize.py -p 'checkers.jpg' -s 90resized 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

不錯!所以程序縮小了圖像,給了它一個描述性的標簽,我們可以看到文件大小從362KB到231KB!

為了查看程序同時處理多個文件,我們將再次運行它:

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

文件系統輸出:

$ 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

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

Click

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

這是通過Python附帶的setuptools庫完成的。

這是我的setup.py.

from setuptools import setupsetup( name=’resize’, version=’0.0.1’, py_modules=[’resize’], install_requires=[ ’click’, ’pillow’, ], entry_points=’’’ [console_scripts] resize=resize:main ’’’)

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

pip install -e .

結論

本教程進行了大量的研究:

首先介紹了一些用于圖像處理的第三方Python庫。 然后使用Python從頭構建一個圖像,以進一步了解圖像的實際含義。 然后,選擇其中一個選項,并構建一個腳本,在保持圖像比例的同時縮小圖像。 最后,把所有這些放在一個命令行實用程序中,通過click接受可配置的選項。

請記住,編寫代碼可能需要數小時或數天。但它只需幾毫秒就可以運行。你制作的程序不必很大。任何一件能節省你的時間或讓你產生更多產出的東西,都有可能為你的余生服務!

原文鏈接:

https://towardsdatascience.co...

以上就是如何使用Python調整圖像大小的詳細內容,更多關于Python調整圖像大小的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 3D全息投影_地面互动投影_360度立体投影_水幕灯光秀 | 广东银虎 蜂窝块状沸石分子筛-吸附脱硫分子筛-萍乡市捷龙环保科技有限公司 | 医院专用门厂家报价-医用病房门尺寸大全-抗菌木门品牌推荐 | 植筋胶-粘钢胶-碳纤维布-碳纤维板-环氧砂浆-加固材料生产厂家-上海巧力建筑科技有限公司 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 通用磨耗试验机-QUV耐候试验机|久宏实业百科 | 定时排水阀/排气阀-仪表三通旋塞阀-直角式脉冲电磁阀-永嘉良科阀门有限公司 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 开云(中国)Kaiyun·官方网站-登录入口| 媒介云-全网整合营销_成都新闻媒体发稿_软文发布平台 | 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 警用|治安|保安|不锈钢岗亭-售货亭价格-垃圾分类亭-移动厕所厂家-苏州灿宇建材 | 5nd音乐网|最新流行歌曲|MP3歌曲免费下载|好听的歌|音乐下载 免费听mp3音乐 | 高压贴片电容|贴片安规电容|三端滤波器|风华电容代理南京南山 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 首页-瓜尔胶系列-化工单体系列-油田压裂助剂-瓜尔胶厂家-山东广浦生物科技有限公司 | 泰来华顿液氮罐,美国MVE液氮罐,自增压液氮罐,定制液氮生物容器,进口杜瓦瓶-上海京灿精密机械有限公司 | 坏男孩影院-提供最新电影_动漫_综艺_电视剧_迅雷免费电影最新观看 | 高温高压釜(氢化反应釜)百科 | 二手电脑回收_二手打印机回收_二手复印机回_硒鼓墨盒回收-广州益美二手电脑回收公司 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 首页-浙江橙树网络技术有限公司| 钢格栅板_钢格板网_格栅板-做专业的热镀锌钢格栅板厂家-安平县迎瑞丝网制造有限公司 | 重庆小面培训_重庆小面技术培训学习班哪家好【终身免费复学】 | 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 动物解剖台-成蚊接触筒-标本工具箱-负压实验台-北京哲成科技有限公司 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | GEDORE扭力螺丝刀-GORDON防静电刷-CHEMTRONICS吸锡线-上海卓君电子有限公司 | 紫外荧光硫分析仪-硫含量分析仪-红外光度测定仪-泰州美旭仪器 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 304不锈钢无缝管_不锈钢管厂家 - 隆达钢业集团有限公司 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 手持式浮游菌采样器-全排二级生物安全柜-浙江孚夏医疗科技有限公司 | 通信天线厂家_室分八木天线_对数周期天线_天线加工厂_林创天线源头厂家 | 发电机组|柴油发电机组-批发,上柴,玉柴,潍柴,康明斯柴油发电机厂家直销 | 医疗仪器模块 健康一体机 多参数监护仪 智慧医疗仪器方案定制 血氧监护 心电监护 -朗锐慧康 | 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 技德应用| 全自动变压器变比组别测试仪-手持式直流电阻测试仪-上海来扬电气 | 变频器维修公司_plc维修_伺服驱动器维修_工控机维修 - 夫唯科技 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 |