---
# System prepended metadata

title: python-影像處理
tags: [課堂筆記ii]

---

## python影像處理
要做影像處理，我們使用工具有
**requests**(處理該圖片網址)
**pillow(PIL)**    (python的影像處理套件)
**io**    (轉換影像url為其他形式保存)
**matplotlib.pyplot**    (繪圖)

```python=
import requests
from PIL import Image, ImageEnhance
from io import BytesIO
import matplotlib.pyplot as plt

url = "https://web.ncku.edu.tw/var/file/0/1000/img/DSC01181ok.jpg"    #目標網址
response = requests.get(url)  #讀取該網址內容
image=Image.open(BytesIO(response.content))    #image.open為產生一個image物件，有自身屬性
plt.axis('off')  # 不顯示座標軸
plt.imshow(image) #plt.imshow 顯示
```
執行結果:
![image](https://hackmd.io/_uploads/ByiWNW6m6.png)

為了方便，寫出一個download圖片的函數，把圖片變成一種變數
```python=
def download_image(url):    #下載圖片函數
    response = requests.get(url)  #讀取該網址內容
    image = Image.open(BytesIO(response.content)) #IO為把文件轉成圖片
    return image
```
### 將兩張圖合起來
```python=
def concatenate_images(image1, image2): #合併圖片的函數
    total_width = image1.width + image2.width #寬度相加 #物件的屬性
    max_height = max(image1.height, image2.height)  #兩張圖片高度切齊(取最高)
    
#PIL.Image.new(mode,size) #創建一個空的image，規格為兩張圖合併後大小
    new_image = Image.new('RGB', (total_width, max_height))    

    new_image.paste(image1, (0, 0))
    new_image.paste(image2, (image1.width, 0))    #圖片的位置也有起始點和終點跟座標系統差不多概念

    return new_image
```
### 色調調整
```python=
color_enhancer = ImageEnhance.Color(image)  #創建一個顏色增強對象
enhanced_image = color_enhancer.enhance(2.0)  # 增强颜色饱和度
combined_image = concatenate_images(image, enhanced_image)
plt.imshow(combined_image)
plt.axis('off')  # 不顯示座標軸
plt.show()
```
色調調整後跟原本圖片合併，結果:
![image](https://hackmd.io/_uploads/H1quYW6mp.png)
### 亮度增強
```python=
brightness_enhancer = ImageEnhance.Brightness(image)  #創建亮度增強對象
brightened_image = brightness_enhancer.enhance(1.5)  # 增加亮度
combined_image = concatenate_images(image, brightened_image)
plt.imshow(combined_image)
plt.axis('off')  # 不顯示座標軸
plt.show()
```
亮度增強後與原本圖片合併，結果:
![image](https://hackmd.io/_uploads/Bkpgc-pma.png)
### other transformation
```python=
gray_image = image.convert("L") #"L"為灰階
combined_image = concatenate_images(image, gray_image)
plt.imshow(combined_image)
plt.axis('off')  # 不顯示座標軸
plt.show()
```
#其他轉換模式:https://blog.csdn.net/icamera0/article/details/50843172
圖片灰化後與原本圖片合併，結果:
![image](https://hackmd.io/_uploads/Sk2ZTWaQp.png)

### 高斯模糊
```python=
from PIL import ImageFilter    #模糊濾鏡

blurred_image = image.filter(ImageFilter.GaussianBlur(radius=100))  #高斯模糊(GaussianBlur)為濾波器的一種

combined_image = concatenate_images(image, blurred_image)
plt.imshow(combined_image)
plt.axis('off')  # 不顯示座標軸
plt.show()
```
高斯模糊後與原本圖片合併，結果:
![image](https://hackmd.io/_uploads/SkQ8pbT7T.png)

### 套用反RGB
```python=
width, height = image.size    #得到該圖片長度寬度

negative_image = Image.new("RGB", (width, height))    #創建一個大小相同空白圖片

# 遍歷每格PIXEL取得像素值
for x in range(width):
    for y in range(height):
        pixel = image.getpixel((x, y))  #它是取每個位置(x,y)的(r,g,b)值

        inverted_pixel = tuple(255 - value for value in pixel)    #反RGB是用256減去該RGB值
        negative_image.putpixel((x, y), inverted_pixel)    #在該圖片的像素位置上填充反轉後RGB


combined_image = concatenate_images(image, negative_image)
plt.imshow(combined_image)
plt.axis('off')  # 不顯示座標軸
plt.show()
```
結果為:
![image](https://hackmd.io/_uploads/rJJ9C-pmp.png)
