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

2022年6月6日 星期一

s1083336 作業7

 作業說明:

    請撰寫一個程式,利用數學型態學影像處理運算(erode(), dilate()等函式),計算出所附圖像(共三張)每張圖像中圍棋個數。


開發環境:

  •     Windows10
  •     VSCode
  •     python 3.10.2
  •     OpenCV 4.5.5

實作說明:
    將圖片讀入後進行二值化(以下影像以IMG_5702.JPG為例)


    因為棋子的部分有許多的雜訊,所以對圖片做dilate去除許多的小黑點,但反光的部分太大了沒辦法處理
    然後對圖片做erode分離每個棋子
    


    最後對圖片做Circle Hough Transform取的分辨出來的棋子的個數




2022年5月29日 星期日

s1083336 作業6

 作業說明:

    請設計一個基於Run-Length的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。


開發環境:

  •     Windows10
  •     VSCode
  •     python 3.10.2
  •     OpenCV 4.5.5

實作說明:
    將讀入的圖片的channel切開來,提高壓縮效率
    B, G, R = cv2.split(img)

    依序將每個channel代入function,計算出美行的結果,並寫入檔案和計算花費
    def dealOneChannel(channel):
        for row in channel:
            result = oneRow(row)
            cost[0] += len(result)
            temp = ""
            for digit in result:
                temp = temp + str(digit) + ", "
            file.write(temp + '\n')
        file.write("\n")

    

    結果參考,一列對應到圖片的一個row的資料,但它會自動換行也不是很好看,每個channel會以一列完全空白的資料分別

壓縮的比例:
    

2022年5月15日 星期日

s1083336 作業5

 作業說明:

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


開發環境:

  •     Windows10
  •     VSCode
  •     python 3.10.2
  •     OpenCV 4.5.5

實作說明:
    1. 先讀入檔案並把型態轉為hsv
    2. 設定黃色的範圍
    3. 使用inRange獲得mask
    4. 用bitwise_and獲得結果
                                                                        結果

    另外有使用 教材6.7.1的方法:
    [hue, saturation, intensity] = cv2.split(hsv)
    threshold = thresholding(saturation, 200).astype('uint8')
    multi = cv2.multiply(threshold, colorFilter(hue, 25, 10).astype('uint8'))
    mask2 = thresholding(multi, 10).astype('uint8')
    那個threshold值是暴力調出來的,沒有去做運算拿到正確的值
    得出mask2,然後同樣使用bitwise_and把得出結果
結果2




2022年4月14日 星期四

s1083336 作業4

 作業說明:

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

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

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


開發環境:

  •     Windows10
  •     VSCode
  •     python 3.10.2
  •     OpenCV 4.5.5

執行:

    執行Assignment3.py後輸入讀取圖片的路徑(記得要加副檔名)

      輸入Gaussian Low-Pass filter 要用的D0


實作方法:

    spectrum: 進行快速傅立葉轉換然後shift把(0, 0) 移到中間,再對圖像做一些處理

    phase angle: 進行傅立葉轉換,並把結果分為實部和虛部,再把結果代入cv2的phase

    gaussian low-pass filter: 照講義的公式即可得出filter


                                                               Gaussian Low-Pass filter  D0 = 50

    再照講義那樣對圖片進行傅立葉轉換 => 乘以filter => 反傅立葉轉換




執行結果:

原圖
                                                                                spectrum

                                                                                    phase angle

                                                            Gaussian Low-Pass filter    D0 = 50





2022年3月20日 星期日

s1083336 作業3

 作業說明:

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


開發環境:

  •     Windows10
  •     VSCode
  •     python 3.10.2
  •     OpenCV 4.5.5

執行:

    執行Assignment3.py後輸入讀取圖片的路徑(記得要加副檔名)


執行結果:

    


程式碼:

edge = np.zeros([rows, cols], dtype="uint8")
standard = 10

    for i in range(1, rows - 1):
        for j in range(1, cols - 1):
            maxi = maxDifference(img[i, j], img[i, j - 1], img[i, j + 1], img[i - 1, j], img[i + 1, j])
            if(maxi > standard):
                edge[i, j] = maxi - 100

    先宣告一個二維矩陣作為畫布。取每個pixel與周圍四個pixel最大的色差距離,如果這個距離大於一定值就依據這個值畫一個點最後就會出現上面左邊那張圖。

    sketch = cv2.GaussianBlur(edge, (15, 15), 50, 50)
    cv2.divide(edge, 255 - sketch, sketch, 255)
 
    用高斯模糊和divide處理拿到的結果就可以拿到右邊那張

2022年2月28日 星期一

s1083336 作業2

 作業說明:

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


開發環境:

  •     Windows10
  •     VSCode
  •     python 3.10.2
  •     OpenCV 4.5.5


執行:

    執行Assignment2.py後輸入讀取圖片的路徑(記得要加副檔名)


執行結果:

    


程式碼:

    mask = np.ones(img.shape[:2], dtype="uint8")
    cv2.circle(mask, center, radius, 0, -1)
    outSide = cv2.bitwise_and(img, img, mask=mask)

    先將mask設定為與讀入圖片大小一樣的陣列並將參數全部設為1,用cv2.circle()將中間不要的部分設為0,最後使用bitwise_and()得到外面的部分,因為外部的部分不會動所以不用更新
    示意圖:
    


    mask = np.zeros(img.shape[:2], dtype="uint8")
    cv2.circle(mask, center, radius, 1, -1)

    再來我們用一樣的方法做內部圓圈的mask,0和1的部分反過來

    rotation = cv2.getRotationMatrix2D(center, angle, 1)
    rotatedImg = cv2.warpAffine(img, rotation, ((int)(row), (int)(col)))
    rotatedImg[mask == 0] = 0
    接下來我們在trackbar的callback function做出旋轉過後的圖片,並依照mask才出中間的圓圈

示意圖:

result = cv2.bitwise_or(outSide, rotatedImg)
最後用bitwise_or()將兩張圖片接在一起就完成了

2022年2月23日 星期三

s1083336 作業1

 作業說明:

    撰寫一個程式讀取一張圖片,將圖像中每一個點像素的值各加上一個數值。如果輸入 圖像是灰階圖像,改變每個像素的灰階值;如果輸入圖像是全彩圖像(RGB),則只改變 每個像素的 R 值。 注意修改後像素值溢位 Overflow 問題(像素值介於 0 與 255 之間)。


開發環境:

  •    windows10
  •     VSCode
  •     python 3.10.2
  •     OpenCV 4.5.5


執行:

    執行assignment1.py後輸入讀取圖片的路徑(記得要加副檔名),再輸入更改圖片顏色的值


程式說明:

    依照路徑讀取圖片後,根據每個像素的RGB是否都一樣推斷是否為灰階圖片,根據作業要求每個pixel的RGB加上輸入的值,最後展示修改前後的圖片。


執行結果:

    lennaRGB.tif - 80

lennaRGB.tif + 80

bookGrat.pdf - 80

bookGray.pdf + 80