【画像処理】画像機械学習の前処理

前処理フィルタについて | 画像処理.com | キーエンス
元の画像
f:id:umashika5555:20170503021649p:plain

グレイスケール
f:id:umashika5555:20170503021659j:plain

膨張フィルタ
f:id:umashika5555:20170503021709j:plain

収縮フィルタ
f:id:umashika5555:20170503021721j:plain

平均化フィルタ
f:id:umashika5555:20170503021730j:plain

メディアンフィルタ
f:id:umashika5555:20170503021744j:plain



平均化フィルタ

#coding:utf-8
"""
$jupyter notebook
$for python3.x
"""
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
from PIL import Image
from PIL import ImageDraw
from random import randint
from os.path import exists
from os import mkdir
from math import fabs
from random import random
from copy import deepcopy
from math import log
from math import sqrt
import cv2
import numpy as np
from collections import namedtuple
import csv

INF = 1e30

def convert(img):
    """収縮フィルタ"""
    #画像のサイズ
    height = img.shape[0]
    width  = img.shape[1]

    #変換後のリスト
    img2 = np.zeros((width, height), np.uint8)

    #変換---------------------------------------------------------------
    for y in range(1,height-1):
        for x in range(1,width-1):
            tmp = 0.0
            for a in range(y-1,y+2):
                for b in range(x-1,x+2):
                    tmp += img[a,b]
            tmp /= 9
            img2[y,x] = tmp            
    #-------------------------------------------------------------------
    
    #画像を表示
    cv2.imshow("image",img2)
    cv2.waitKey(0)#キーを押すと終了
    cv2.destroyAllWindows()

    #画像を出力
    file_name = "expansion_filter"
    cv2.imwrite(file_name+".jpg",img2)

def main():
    #特徴ベクトルの型の定義
    vec = namedtuple('vec_info',['GBR','coordinate'])

    #画像を読み込み
    filename = "ika.png"
    img = cv2.imread(filename,0)
    
    #GLAY_SCALE画像を出力
    file_name = "GRAY_SCALE"+filename
    cv2.imwrite(file_name+".jpg",img)

    #膨張フィルタ
    convert(img)

if __name__ == '__main__':
    main()

膨張フィルタ

    for y in range(1,height-1):
        for x in range(1,width-1):
            tmp = -INF
            for a in range(y-1,y+2):
                for b in range(x-1,x+2):
                    tmp = max(tmp,img[a,b])
            img2[y,x] = tmp   

収縮フィルタ

    for y in range(1,height-1):
        for x in range(1,width-1):
            tmp = INF
            for a in range(y-1,y+2):
                for b in range(x-1,x+2):
                    tmp = min(tmp,img[a,b])
            img2[y,x] = tmp     

メディアンフィルタ

    for y in range(1,height-1):
        for x in range(1,width-1):
            tmp = list()
            for a in range(y-1,y+2):
                for b in range(x-1,x+2):
                    tmp.append(img[a,b])
            print(tmp)
            img2[y,x] = sorted(tmp)[4]

端っこについては考察していない.
4マスで考えれば良いのかな?
特徴抽出はあくまで中央のものだから端っこはあまり重要ではない気がするが