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

2019年6月2日 星期日

1051549的作業5

Morphological Image Processing

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

環境需求

  • windows 10
  • python 3.7
  • opencv 4.0
  • numpy 1.15.1
  • matplotlib 2.2.3

實現方法

主要方法是偵測每個物件的輪廓,計算有輪廓形狀的物件數量,根據輪廓內的面積篩掉棋子上的反光的雜訊
  1. 一開始使用imread(image, 0) ,把讀進來的圖轉成灰階圖
  2. 讓圖像的細節模糊化,用GaussianBlur(),降低雜訊
  3. 再用open = morphologyEx(image, MORPH_OPEN, kernel),用open morphology方法去除周遭的雜訊,這裡我設kernel為(30,30)大小的矩形,可以有效篩掉大多數的棋子上的反光
  4. 將open之後的結果做threshold(open, 0, 255, THRESH_BINARY | THRESH_OTSU),這裡用Otsu’s algorithm偵測閾值,所以一開始初始閾值可以隨便給,之後會再修正
  5. 用sobel’s algorithm,偵測物件的邊緣,以偵測x , y軸的邊緣並取絕對值再疊加兩張軸的圖片
  6. findContours(sobel, RETR_LIST, CHAIN_APPROX_SIMPLE)找出所有物件輪廓
  7. 根據findContours找到物件數量,用contourArea()篩選掉剩下的棋子反光雜訊,這裡我以area < 10當作篩選條件,最後統計可能是黑子的數量

運行結果

左圖是原圖,右圖是輪廓偵測完的結果

第一張圖原來是24顆,程式判斷22顆
第二張圖原來是31顆,程式判斷30顆
第三張圖原來是31顆,程式判斷28顆

2019年5月12日 星期日

1051549的作業4

Skin Color Detection

利用你所學的顏色知識,撰寫一個程式來偵測一張輸入圖片中的皮膚區域並將其標示出來

使用環境

  • windows10
  • python 3.7
  • opencv 4.0
  • numpy 1.15.1
  • matplotlib 2.2.3

實作說明

運行步驟圖
一開始cv.imread()讀圖進來,opencv預設彩圖是BGR模式
轉換成HSV,BGRA,YCrCb圖
hsv_img = cv.cvtColor(img, cv.COLOR_BGR2HSV)
Bgra_img = cv.cvtColor(img, cv.COLOR_BGR2BGRA)
Ycrcb_img = cv.cvtColor(img, cv.COLOR_BGR2YCrCb)
並把HSV,BGRA,YCrCb通道分離出來,
(B,G,R,A) = cv.split(Bgra_img)
(H,S,V) = cv.split(Hsv_img)
(Y,Cb,Cr) = cv.split(Ycrcb_img)
若要套用以下公式判斷,需要調整HSV三通道配置
一般HSV的理論值是
H = 0 ~ 360
S = 0 ~ 1
V = 0 ~ 1
而opencv對於轉換後的HSV設定是
H = 0 ~ 180
S = 0 ~ 255
V = 0 ~ 255
根據論文人體皮膚感測理論,列出以下條件判斷式,若在條件範圍內的點是白色,反之,則是黑色,最後以單通道顯示結果
if 0.0 <= H <= 50.0 and 0.23 <= S <= 0.68 \
   and R > 95 and G > 40 and B > 20 \
   and R > G and R > B and | R - G | > 15 and A > 15 :
     dstImg = 255
elif R > 95 and G > 40 and B > 20 \
   and R > G and R > B and | R - G | > 15 and A > 15 \
   and Cr > 135 and Cb > 85 and Y > 80 \
   and Cr <= (1.5862*Cb)+20 and Cr >= (0.3448*Cb)+76.2069 \
   and Cr >= (-4.5652*Cb)+234.5652 and Cr <= (-1.15*Cb)+301.75 \
   and Cr <= (-2.2857*Cb)+432.85:
     dstImg = 255
else:
   dstImg = 0
處理完結果用 matplotlib.pyplot顯示圖片
import matplotlib.pyplot as plt

plt.subplot(122),plt.imshow(dstImg, cmap='gray')
plt.title('skin dection'),plt.axis("off")
plit.show()
設定顯示圖像以及儲存圖像的尺寸大小
plt.rcParams['savefig.dpi'] = 300 #圖片像素
plt.rcParams['figure.dpi'] = 300 #分辨率
# 默認的像素:[6.0,4.0],分辨率為100 圖片尺寸為 600&400
# 指定dpi=200,圖片尺寸為 1200*800
# 指定dpi=300,圖片尺寸為 1800*1200

完成結果

結論:這個膚色偵測公式對於亞洲人,不那麼黑的非洲人,以及白人效果特別好,但是太黑的黑人會被認為是背景

2019年5月8日 星期三

1051549的作業3

離散傅立葉轉換DFT練習

題目說明


讀取一張256色灰階圖像,計算輸入圖的離散傅立葉轉換結果,並將頻譜大小跟相位角度各以灰階256色圖像方式呈現出

環境需求


  • windows10
  • python 3.7
  • numpy 1.15.1
  • opencv 4.0
  • matplotlib 2.2.3

實作內容


一開始,我使用numpy套件中的np.fft.fft2()函式,將原圖經過快速傅立葉轉換變成複數矩陣
fft = np.fft.fft2(img)

origin image:

fft image:

利用以下公式,求出頻譜圖

使用np.abs()將複數透過絕對值轉換成跟原點之間的距離
由於原圖經過FFT轉換後,實數部分大於10^6以上,取對數值可以有效將數值限制在一定範圍之間
magnitude_spectrum = np.log(np.abs(fftshift))
為了能夠清楚分析頻域分布,我們需要將原點(0,0)移到圖像的中心(M/2,N/2)位置,將每點乘上(-1),用np.fft.fftshift()做轉換
fftshift = np.fft.fftshift(fft)

位移圖像:

位移前的FFT圖:

位移後的FFT圖:

利用以下公式,I(u,v)是虛數(sin角),R(u,v)是實數(cos角),利用arctan方式求出原來幅角
使用np.angular()公式求出原來的幅角
ph_fftshift = np.angle(fftshift)

實際運行結果:


左圖第一張是原圖,第二張是頻域圖,第三張是相位圖

2019年4月3日 星期三

1051549,作業2

一、題目
撰寫一個程式,讀取一張 256 色灰階圖像或 RGB 全彩圖像,利用 Sobel Operators 偵測圖像邊緣,並以邊緣偵測為基礎,設計一個類似素描線條自畫像程式。


二、環境配置

  • windows10
  • python 3.7
  • opencv 4.0
  • numpy 1.15.1

三、實作方法
一開始,imread讀取圖檔


如果圖檔是彩色圖,先將圖片轉為YCrCb格式,分離Y channel,轉成灰階圖,讓通道只能一個
原圖-轉為灰階

用GaussianBlur過濾圖片細節的部分,減少細節層次顯示,讓邊緣更明顯
高斯過濾圖

利用Sobel operators偵測圖像邊緣,計算x跟y方向的梯度
Gx方向圖像邊緣
x方向的梯度圖

Gy方向圖像邊緣
y方向的梯度圖
將兩個梯度方向的圖像組合


原圖與結果的圖像比較