天天看點

python讀取圖檔檔案顯示_Python—圖像基本操作以及圖像格式轉換

關于圖像處理的子產品常用的有 PIL,openCV等,不過應為要處理 tif 格式的圖檔,故特來寫下這篇部落格。

關于安裝子產品 libtiff

直接pip install libtiff 安裝子產品,發現無法導入,顯示“No module named libtiff” ,打開anaconda prompt 執行conda list顯示子產品确實已經安裝。嘗試了把libtiff移除再重裝還是沒解決。

一、圖檔 讀、寫、顯示、屬性檢視

libtiff 包裝器

from libtiff import TIFF

tif = TIFF.open('filename.tif', mode='r') #打開tiff檔案進行讀取

image = tif.read_image() #讀取圖像并作為numpy數組傳回

for image in tif.iter_images() #讀取TIFF檔案中的所有圖像

tif = TIFF.open('filename.tif', mode='w') #打開tiff檔案進行寫入

tif.write_image(image) #将圖像寫入tiff檔案

Python 子產品

from libtiff import TIFFfile, TIFFimage

tif = TIFFfile('filename.tif') #讀取圖檔

samples, sample_names = tiff.get_samples()

tiff = TIFFimage(data, description='')

tiff.write_file('filename.tif', compression='none') # or 'lzw'

del tiff # 重新整理(釋放緩存)

opencv 子產品

import cv2

cv2.imread("filename",flags)

=====================其中:flags四種選擇如下:==================

IMREAD_UNCHANGED = -1 #不進行轉化,比如儲存為了16位的圖檔,讀取出來仍然為16位。

IMREAD_GRAYSCALE = 0 #轉化為灰階圖,比如儲存為了16位的圖檔,讀取出來為8位,類型為CV_8UC1。

IMREAD_COLOR = 1 #進行轉化為RGB三通道圖像,圖像深度轉為8位

IMREAD_ANYDEPTH = 2 #保持圖像深度不變,進行轉化為灰階圖。

IMREAD_ANYCOLOR = 4 #若通道數小于等于3,則保持不變;若通道數大于3則隻取取前三個通道。圖像深度轉為8位

對于多通道TIFF圖像,若要保證圖像資料的正常讀取,顯然要選擇IMREAD_UNCHANGED

PIL 子產品

from PIL import Image

img0 = Image.open("D:/python_script/ffff/11lalala.jpg")

img1 = Image.open("D:/python_script/ffff/42608122.tif")

img2 = Image.open("D:/python_script/ffff/42608122_1.jpg") #這張圖檔是直接修改上張圖的字尾名

print ("圖檔格式:{0},圖檔大小:{1},圖檔模式:{2}".format(img0.format,img0.size,img0.mode))

print ("圖檔格式:{0},圖檔大小:{1},圖檔模式:{2}".format(img1.format,img1.size,img1.mode))

print ("圖檔格式:{0},圖檔大小:{1},圖檔模式:{2}".format(img2.format,img2.size,img2.mode))

輸出:#說明直接修改圖檔字尾名,圖檔的編碼格式并沒有改變

圖檔格式:JPEG,圖檔大小:(245, 213),圖檔模式:RGB

圖檔格式:TIFF,圖檔大小:(2480, 3508),圖檔模式:YCbCr

圖檔格式:TIFF,圖檔大小:(2480, 3508),圖檔模式:YCbCr

直接修改圖檔格式

import PIL.Image

import os

def convert(input_dir,output_dir):

for filename in os.listdir(input_dir):

path = input_dir+"/"+filename

print("doing... ",path)

PIL.Image.open(path).save(output_dir+"/"+filename[:-4]+".jpg")

print ("%s has been changed!"%filename)

if __name__ == '__main__':

input_dir = "D:/classifier_data20181225/img1"

output_dir = "D:/classifier_data20181225/img2"

convert(input_dir,output_dir)

大(分辨率大)圖檔縮小

遇到分辨率大,圖檔檔案大小并不大的檔案,opencv打不開,此時用到了以下代碼用來縮小圖檔。

若檔案寬大于1200,(高度小于1800)以此寬度等比縮放

若檔案高大于1800,(寬度小于1200)以此高度等比縮放

import os

from PIL import Image

import shutil

def get_img(input_dir):

img_path_list = []

for (root_path,dirname,filenames) in os.walk(input_dir):

for filename in filenames:

img_path = root_path+"/"+filename

img_path_list.append(img_path)

print("img_path_list",img_path_list)

return img_path_list

def process_image(filename,output_dir, mwidth=1200, mheight=1800):

image = Image.open(filename)

w, h = image.size

if w <= mwidth and h <= mheight:

print(filename, 'is OK.')

shutil.move(filename, output_dir+filename[-15:])

return

if (1.0 * w / mwidth) > (1.0 * h / mheight):

scale = 1.0 * w / mwidth

new_im = image.resize((int(w / scale), int(h / scale)), Image.ANTIALIAS)

else:

scale = 1.0 * h / mheight

new_im = image.resize((int(w / scale), int(h / scale)), Image.ANTIALIAS)

new_im.save(output_dir+filename[-15:])

new_im.close()

if __name__ == '__main__':

input_dir = "D:/classifier_data20181212/lipei_resize_1"

output_dir = "D:/classifier_data20181212/lipei_resize/"

img_path_list = get_img(input_dir)

for filename in img_path_list:

print("filename",filename)

process_image(filename,output_dir)