顯示具有 s1081516 標籤的文章。 顯示所有文章
顯示具有 s1081516 標籤的文章。 顯示所有文章

2022年6月2日 星期四

s1081516 作業7

作業說明: 
請撰寫一個程式,利用數學型態學影像處理運算(erode(), dilate()等函式),計算出所附圖像(共三張)每張圖像中圍棋個數。
a.      請在部落格呈現經由數學型態學影像處理運算後的圖像,同時要呈現你程式輸出棋子數量的螢幕截圖。
b.     程式不一定可以算出正確棋子數量,越接近正確答案越好!

開發環境:

    Windows 11

    Anaconda 4.10.3

    Python 3.9.7

    numpy 1.20.3

    opencv-python 4.5.5.62

程式說明:

1.    cv2.IMREAD_GRAYSCALE的方式讀圖片

2.    erode()後做dilate()

3.     cv2.HoughCircles找出圓形個數

4.     利用loop根據3.找出的圓形的圓心座標及半徑用cv2.circle把偵測到的圓形畫在圖片上

5.      呈現結果,若還有圖片未處理返回第一步

執行結果:

IMG_5702.JPG(原圖:24顆,偵測24顆)

IMG_5703.JPG(原圖:31顆,偵測31顆)
IMG_5704.JPG(原圖:31顆,偵測31顆)

2022年5月30日 星期一

s1081516 作業6

 作業說明:

附件中為三張利用將晶片高度以色彩視覺化後的圖片。
請設計一個基於Run-Length的壓縮方法,對圖檔作無失真壓縮後儲存成新檔案。
部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率(compression ratio)

開發環境:

    Windows 11
    Anaconda 4.10.3
    Python 3.9.7
    numpy 1.20.3
    opencv-python 4.5.5.62

程式說明:

encode.py

1.     讀入圖片分割成RGB 三個Chanel

2.     將分割後的Chanel變成一維,做Run-Length 壓縮,每組資料的儲存格式 => (值,長度)

        type = np.uint8,如果長度 > 255,用多組資料儲存

3.     將壓縮後的資料(包含r,g,b三個chanel壓縮後的值以及原圖片的長寬(h,w))儲存成另一個檔案(.npz)

4.     輸出原圖片(.bmp)、壓縮後(.npz)的檔案大小以及壓縮率

  • 若還有圖片要壓縮,重新執行步驟1~4

5.     輸出平均壓縮率

decode.py

1.       讀入壓縮檔(.npz)

2.       r,g,b三個chanel各自解壓縮

3.       2.的結果reshape(h,w)

4.       3的結果merge成圖片,並用astype(np.uint8)設定圖片格式

5.       產生透過壓縮檔產生的圖片(.bmp)

執行結果:

原圖、壓縮檔、還原後的圖片









2022年5月18日 星期三

s1081516 作業5

作業說明:

撰寫一個程式將所附圖像flower.jpg的黃色花瓣區域擷顯示出來。

開發環境:

    Windows 11

    Anaconda 4.10.3

    Python 3.9.7

    numpy 1.20.3

    opencv-python 4.5.5.62

程式說明:

1.輸入image之檔名。

2.用cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL)imageRGB轉換為HSV

3.設定黃色的lower和upper

4.利用inRange()得到mask

5.最後做bitwise_and()即可得黃色部分。

結果:

原圖

HSV

Mask

黃色花瓣區域



2022年4月13日 星期三

s1081516 作業4

作業說明:

離散傅立葉轉換 DFT練習

請撰寫一個程式,讀取一張256色灰階圖像。

(1)    計算輸入圖的離散傅立葉轉換結果,並將頻譜大小與相位角度各以灰階256色圖像方式呈現出。

(2)    對圖像利用Gaussian Low-Pass filter處理,輸出平滑後圖像。

(程式利用課本的frequency filter步驟者可得滿分,在網頁中將每個步驟結果呈現出。直接套用opencv函數得一半分數。)

開發環境:

    Windows 11
    Anaconda 4.10.3
    Python 3.9.7
    numpy 1.20.3
    opencv-python 4.5.5.62

程式說明:

cv2.imread(inputFile,cv2.IMREAD_GRAYSCALE).astype(np.float32) 讀圖片
(1)
·     np.fft.fft2函數作傅立葉轉換
·     np.fft.fftshift0頻率移到中間(有實部跟虛部)
·     np.abs取得spectrum,np.angle取得Phase
(2)
·     zero_paded(M,N)的變成(2* M,2 * N)的圖片後乘上(-1)x+y
·     np.fft.fft2取得頻譜
·     產生Gaussian Low-Pass filter, size = (2* M,2 * N), center = (M,N), D0 = 50
        -  Filter 在輸出圖片的時候有乘上255
·    
spectrum的部分和filternp.multiply取得G(u,v)
·     combined =   np.multiply(G(u,v)spectrum, np.exp(1j * 原圖片的phase)
·     用這三行code還原成圖片
  • freq_filt_img = np.real(np.fft.ifft2(combined))
  • freq_filt_img = np.abs(freq_filt_img)
  • freq_filt_img = freq_filt_img.astype(np.uint8)
·     for loop從還原後的圖片的左上取M*N的值,截切成和原圖片相同大小

執行結果:    Spectrum 的部分在輸出圖片時都有做20 * log (1 + Specrtum) 

原圖

(1)

                     Spectrum                     Phase (輸出時做astype(np.uint8))

(2)    

        平滑後圖像

2022年3月21日 星期一

s1081516 作業3

 作業說明:

撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE) (a)利用 Sobel Operators 偵測並輸出邊緣成分圖 (b)設計一個類似素描線條的自畫像圖案。(想想:如何使用邊緣偵測所得到的點,結合 成看似素描筆畫出的線條?)

開發環境:

l   Windows 11

l   Anaconda 4.10.3

l   Python 3.9.7

l   numpy 1.20.3

l   opencv-python 4.5.5.62

程式說明:

1.      輸入要讀取的圖片路徑

2.      選擇Mode

(a)利用 Sobel Operators 偵測並輸出邊緣成分圖

(b)設計一個類似素描線條的自畫像圖案

3.1  Mode acv2.Sobel()分別找出xy的梯度,再用cv2.addWeighted()合併

3.2  Mode b把原圖反白後做Gaussian Blur,用cv2.divide之後輸出

Gaussian Blur ksize和sigma的值可以用trackbar來調整,範圍設定為0~100ksize 實際的質為trackbar 中ksize的值 * 2 + 1 (Esc關閉視窗)

4. 關閉視窗後輸入要輸出的圖片名稱

執行結果:

原圖

灰階圖

Mode a

Mode b


2022年3月10日 星期四

s1081516 作業2

 作業說明:

撰寫一個程式將一張圖像的(a)整張圖像,(b)中心內切圓區域,旋轉一個角度(逆時針旋 0 度至 359 ):利用一個滑動條(trackbar)控制旋轉角度。

開發環境:

l   Windows 10

l   Anaconda 4.10.3

l   Python 3.9.7

l   numpy 1.20.3

l   opencv-python 4.5.5.62

程式說明:

1.       輸入要旋轉的圖片路徑,輸入 1就是結束程式

2.       輸入要怎麼旋轉,0是整張圖片,1是中心內切圓區域

  •    旋轉的角度利用trackbar來調整,範圍是0到359度

3.       如果是內切圓區域,先複製一次圖片,然後旋轉,之後再用旋轉後的圖片的中心區域的值   修改要呈現的圖片

4.       如果要關閉視窗,按Esc

5.       輸入要輸出的圖片名稱

6.  產生新圖片

執行結果:

原圖
旋轉整張圖片
旋轉內切圓區域




2022年2月23日 星期三

s1081516 作業1

作業說明

撰寫一個程式讀取一張圖片,將圖像中每一個點像素的值各加上一個數值。如果輸入

圖像是灰階圖像,改變每個像素的灰階值;如果輸入圖像是全彩圖像(RGB),則只改變

每個像素的 R 值。注意修改後像素值溢位 Overflow 問題(像素值介於 0 與 255 之間)。

開發環境

  • Windows 10
  • Anaconda 4.10.3
  • Python 3.9.7
  • numpy 1.20.3
  • opencv-python 4.5.5.62

程式說明

1 輸入圖片的路徑,當輸入-1結束程式

        👉如果讀不到圖片,印出錯誤訊息後重新輸入

2 輸入要在圖像中每個像素增加的數值(可為負數)

3 用Flag為IMREAD_UNCHANGED讀圖片後用cv2.ndim判斷是灰階圖還是彩圖

4 如果是灰階圖用Gray(img)改變灰階值,而全彩圖用Color(img)改變R值

        👉方法為用兩層的for loop分別改每一個像素的值,改變的值為2輸入的值

5 秀出原本的圖片和新的圖片

        👉用np.hstack(舊圖片,新圖片)把兩張圖片串接在一起,比較方便比較

6 關閉圖片視窗後輸入要產生的圖片檔案名稱

        👉如果輸入的名稱未包含 .jpg或 .tif,產生的圖片名稱會自動加上.jpg

7 產生新圖片的檔案(只會有新圖片)

執行結果

灰階圖(ndim = 2)

原圖

增加100(+100)
減少100(-100)

全彩圖(ndim = 3)

原圖
增加100(+100)
減少100(-100)