python保存圖片時如何和原圖大小一致
python保存圖片時和原圖大小一致
之前遇到過一次這個問題,當時解決了但是忘了記錄,這里再記錄一次好了。
1. matplotlib系列的
整體代碼如下:
import cv2 import matplotlib.pyplot as plt name="1-1.png" path="crop/"+name src = cv2.imread(path) img = cv2.cvtColor(src, cv2.COLOR_BGR2RGB) # Opencv和matplotlib讀取圖片的渠道不同,需要轉(zhuǎn)換 # cv2.imshow("original image", src) # 獲取圖像的高度和寬度 plt.savefig('my_fig.png', dpi=my_dpi) plt.imshow(img) IMG = cv2.bitwise_not(img) # 進行反色操作 # cv2.imshow("bitwise image", img) mydpi=96 plt.figure(figsize=(Width/mydpi,Height/mydpi),dpi=mydpi) # figsize中的單位是inches,重點解釋一下這個figsize參數(shù),先寫寬度,再高度 """ figsize : (float, float), optional, default: None width, height in inches. If not provided, defaults to:rc:`figure.figsize` = ``[6.4, 4.8]`` """ plt.imshow(IMG) plt.axis('off') # 去掉坐標軸 # 保存 plt.savefig("processcrop/"+name,dpi=mydpi)
但是不知道為什么還是會有白邊。。。
注意:
- 如果是在jupyter lab中,plt.axis('off')就不會有問題,但是在jupyter notebook中,就會報錯。
jupyter lab中:
jupyter notebook中,再次恢復環(huán)境竟然好了,之前的報錯信息大概就是plt.axis("off")這個函數(shù)不接受bool類型的值
2. opencv系列的
opencv默認保存就是和原圖一樣的大小
name="1-1.png" path="crop/"+name src = cv2.imread(path) plt.imshow(src[:, :, ::-1]) plt.axis('off') img = cv2.bitwise_not(src) cv2.imwrite("processcrop/"+name,img)
原圖:
保存后的圖:
參考——stack overflow的回答:Specifying and saving a figure with exact size in pixels
plt.figure(figsize=(800/my_dpi, 800/my_dpi), dpi=my_dpi) # 假設有一個800×800pix的圖,要顯示在本機電腦dpi為96的電腦上,則要保持原圖大小顯示就可以使用上述代碼。 plt.savefig('my_fig.png', dpi=my_dpi) # 保存成相同分辨率,使用上述代碼 # 如果想把分辨率提高10倍,則可以進行如下方式,則就保存了一個8000X8000的高清圖 plt.savefig('my_fig.png', dpi=my_dpi * 10)
另外根據(jù)另一個回答:How to get matplotlib figure size
import matplotlib.plt fig = plt.figure() # 在構(gòu)建畫布的時候就已經(jīng)有一個默認的分辨率了 size = fig.get_size_inches()*fig.dpi # size in pixels
python批量處理圖片統(tǒng)一尺寸
方法一:
import numpy as np import os import cv2 # 設置圖片路徑,該路徑下包含了14張jpg格式的照片,名字依次為0.jpg, 1.jpg, 2.jpg,...,14.jpg DATADIR="D:\Code\ToolBox" #設置目標像素大小,此處設為300''' IMG_SIZE=300 #使用os.path模塊的join方法生成路徑''' path=os.path.join(DATADIR)? #使用os.listdir(path)函數(shù),返回path路徑下所有文件的名字,以及文件夾的名字, #例如,執(zhí)行下行代碼后,img_list是一個list,值為['0.jpg','1.jpg','10.jpg','11.jpg','12.jpg','13.jpg','14.jpg', #'2.jpg','3.jpg','4.jg', '5.jpg', '6.jpg', '7.jpg',? #'8.jpg', '9.jpg'],注意這個順序并沒有按照從小到大的順序排列''' img_list=os.listdir(path) ind=0 for i in img_list: ?? ?#調(diào)用cv2.imread讀入圖片,讀入格式為IMREAD_COLOR''' ? ? img_array=cv2.imread(os.path.join(path,i),cv2.IMREAD_COLOR) ? ? #'''調(diào)用cv2.resize函數(shù)resize圖片''' ? ? new_array=cv2.resize(img_array,(IMG_SIZE,IMG_SIZE)) ? ? img_name=str(ind)+'.jpg' ? ? #'''生成圖片存儲的目標路徑''' ? ? save_path='D:\\Code\\resized\\'+str(ind)+'.jpg' ? ? ind=ind+1 ? ? #'''調(diào)用cv.2的imwrite函數(shù)保存圖片''' ? ? cv2.imwrite(save_path,new_array)
方法二:
#提取目錄下所有圖片,更改尺寸后保存到另一目錄 from PIL import Image import os.path import glob def convertjpg(jpgfile,outdir,width=128,height=128): ? ? img=Image.open(jpgfile) ? ? try: ? ? ? ? new_img=img.resize((width,height),Image.BILINEAR) ?? ? ? ? ? new_img.save(os.path.join(outdir,os.path.basename(jpgfile))) ? ? except Exception as e: ? ? ? ? print(e) for jpgfile in glob.glob("E:\\img\\*.jpg"): ? ? convertjpg(jpgfile,"E:\\lianhua")
方法三:該方法批量修改圖片大小和文件夾名稱
import os from PIL import Image from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True from matplotlib.font_manager import FontProperties font = FontProperties(fname=r'c:\windows\fonts\SimSun.ttc', size=14) # 獲取當前路徑 path_abs = os.getcwd() print u'*****************開始文件名更名操作*****************' print path_abs # 遍歷當前路徑下的文件以及文件目錄 for root, dir_name, file_name in os.walk(path_abs): ? ? # 統(tǒng)計文件夾個數(shù) ? ? num_dir = len(dir_name) ? ? for idx, item in enumerate(dir_name): ? ? ? ? print u'第', idx, u'個文件正在更名......' ? ? ? ? item_new = 'test_' + '0' * (1 - idx / 10) + str(idx) ? ? ? ? # 原文件路徑 ? ? ? ? path_dir_old = path_abs + '\\' + item ? ? ? ? # print u'原文件路徑:', path_dir_old ? ? ? ? # 新文件路徑 ? ? ? ? path_dir_new = path_abs + '\\' + item_new ? ? ? ? # print u'新文件路徑:', path_dir_new ? ? ? ? # 更名操作 ? ? ? ? os.renames(path_dir_old, path_dir_new) print u'*****************文件名更名完畢!*****************' print u'*****************圖片名更名*******************' for root1, dir_name1, file_name1 in os.walk(path_abs): ? ? num1_dir = len(dir_name1) ? ? for idx1, item1 in enumerate(dir_name1): ? ? ? ? path_dir1 = path_abs + '\\' + item1 ? ? ? ? for root2, dir_name2, file_name2 in os.walk(path_dir1): ? ? ? ? ? ? for idx2, item2 in enumerate(file_name2): ? ? ? ? ? ? ? ? # 原路徑 + 圖片名 ? ? ? ? ? ? ? ? item2_old = path_dir1 + '\\' + item2 ? ? ? ? ? ? ? ? # 新路徑 + 圖片名(強制轉(zhuǎn)換成jpg格式,數(shù)字6制定圖片名長度以及0的填充個數(shù)) ? ? ? ? ? ? ? ? item_new2 = 'idx_'+ '0' * (5 - len(str(idx2))) + str(idx2) ? ? ? ? ? ? ? ? item2_new = path_dir1 + '\\' + item_new2 + '.jpg' ? ? ? ? ? ? ? ? # 更名 ? ? ? ? ? ? ? ? os.rename(item2_old, item2_new) ? ? ? ? ? ? ? ? # resize 成指定尺寸大小 ? ? ? ? ? ? ? ? img = Image.open(item2_new) ? ? ? ? ? ? ? ? img_new = img.resize((220, 220)) ? ? ? ? ? ? ? ? # save 保存 ? ? ? ? ? ? ? ? img_new.save(item2_new)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python數(shù)據(jù)可視化實現(xiàn)漏斗圖過程圖解
這篇文章主要介紹了Python數(shù)據(jù)可視化實現(xiàn)漏斗圖過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07Pytorch中.detach()與.data的用法小結(jié)
這篇文章主要介紹了Pytorch中.detach()與.data的用法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07python中mediapipe庫踩過的坑實戰(zhàn)記錄
MediaPipe是由google制作的開源的、跨平臺的機器學習框架,可以將一些模型部署到不同的平臺和設備上使用的同時,也能保住檢測速度,下面這篇文章主要給大家介紹了關于python中mediapipe庫踩過的坑的相關資料,需要的朋友可以參考下2023-04-04Python利用jmespath模塊進行json數(shù)據(jù)處理
jmespath是python的第三方模塊,是需要額外安裝的。它在python原有的json數(shù)據(jù)處理上做出了很大的貢獻。本文將詳細介紹如何利用jmespath實現(xiàn)json數(shù)據(jù)處理,需要的可以參考一下2022-03-03Python configparser模塊封裝及構(gòu)造配置文件
這篇文章主要介紹了Python configparser模塊封裝及構(gòu)造配置文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08