前言 圖像是 Web 應用中除文字外最普遍的媒體格式。 流行的 Web 靜態圖片有 JPEG、PNG、ICO、BMP 等。動態圖片主要是 GIF 格式。 為了節省圖片傳輸流量,大型互聯網公司還會定製特殊格式的圖片,WEBP 格式就是一個代表。 Python 除了數據分析,做圖片處理也是非常好用的。 ...
前言
圖像是 Web 應用中除文字外最普遍的媒體格式。
流行的 Web 靜態圖片有 JPEG、PNG、ICO、BMP 等。動態圖片主要是 GIF 格式。
為了節省圖片傳輸流量,大型互聯網公司還會定製特殊格式的圖片,WEBP 格式就是一個代表。
Python 除了數據分析,做圖片處理也是非常好用的。
用 Python 做圖片處理,最著名的庫就是 PIL(Python Imaging Library)了,支持最新的 Python3,而且有許多新的特性,Pillow
也成為了 Python 圖片處理必不可少的工具之一了。
不過我們今天要使用的作圖庫是OpenCV Python ,下一期我們再來研究PIL
這篇文章主要介紹了Python+OpenCV實現圖像二值化,幫助大家更好的利用python處理圖片,感興趣的朋友可以瞭解下。
圖片處理庫準備
OpenCV Python 來處理圖片,安裝過程如下:
pip install opencv-python
圖片載入
我們先來打開一張圖片測試,如下可以成功載入圖片表示已經
成功安裝OpenCV-Python
圖片縮放
在保持圖片細節不變的前提下,把圖片放大或者縮小。
其中img 是圖片對象,img.shape 表示圖片的形狀大小,分別是高、寬、通道數。
Python學習交流Q群:906715085### # 獲取圖片尺寸 img = cv2.imread("./pic1.jpg") h, w, ch = img.shape print(h, w, ch) ''' 1240 960 3 '''
我們的思路如下:
程式讀入圖片文件,用 cv2.resize 方法,把圖片等比例縮放為一半的大小。
Python學習交流Q群:906715085### # 獲取圖片尺寸 img = cv2.imread("./pic1.jpg") h, w, ch = img.shape print('原圖尺寸:', h, w, ch) new_h = int(h / 2) new_w = int(w / 2) res = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_LINEAR) cv2.imwrite('./half_pic1.jpg', res) # 獲取圖片尺寸 img = cv2.imread("./half_pic1.jpg") h, w, ch = img.shape print('縮半原圖尺寸:', h, w, ch) ''' 原圖尺寸:1240 960 3 縮半原圖尺寸:620 480 3 '''
實際效果如下:
圖片裁剪
把圖片的局部形狀截取出來,這裡我們截取小姐姐圖像,按照自己需求去掉前後左右多餘邊框。
Python學習交流Q群:906715085### img = cv2.imread("./pic1.jpg") h, w, ch = img.shape print(h, w, ch) # (x0,y0) (x1,y1) 矩陣 x0, y0 = 200, 80 x1, y1 = 880, 960 # img 是一個按行掃描的矩陣 res = img[y0:y1, x0:x1] print('截取後 H,W=', res.shape[:2]) cv2.imwrite('./pic.jpg', res) ''' 1240 960 3 截取後 H,W= (880, 680) '''
實際效果如下:
圖像組合
把兩個或者多個圖像進行堆疊、拼接。
準備一個原圖 pic1.jpg,再準備一個水印圖 img.png,目標是把水印貼在人像圖的最右下方。
# 讀取原始圖片 image = cv2.imread('./pic1.jpg') (h, w) = image.shape[:2] print("SOURCE", image.shape) # 讀取水印 imgsy = cv2.imread('./img.png') (h_sy, w_sy) = imgsy.shape[:2] print("SHUIYIN", imgsy.shape) # 定義原圖片選區 roi = image[h - h_sy:h, w - w_sy:w] # 原圖片選區和水印區融合,讓水印透明 for y in range(h_sy): for x in range(w_sy): p = imgsy[y, x] if (p[0], p[1], p[2]) == (0, 0, 0): imgsy[y, x] = roi[y, x] cv2.imwrite('./shuiyin+roi.png', imgsy) # 選區範圍設定為融合後的水印 image[h - h_sy: h, w - w_sy: w] = imgsy cv2.imwrite('./pic_sy.jpg', image)