From 23c56fe84a91fd34e714234591f39308f5ce2f38 Mon Sep 17 00:00:00 2001 From: dehan2 Date: Thu, 4 Jun 2015 22:46:10 +0900 Subject: [PATCH] Homework 2_3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 안녕하세요, 교수님. 기계공학과 2013701079 차제현 학생입니다. 저희 조는 Homework 2를 맡았으며, 그 중 제가 맡은 부분은 2.3 - FAST edge detector와 BRIEF descriptor입니다. 파이썬 코드와 함께 테스트로 사용한 그림도 함께 보내드립니다. 보시고 말씀해 주세요. 감사합니다. 차제현 드림 --- Homework2/Problem2_3/200_redCell.png | Bin 0 -> 44659 bytes Homework2/Problem2_3/BRIEF descriptor.py | 54 +++++++++++ Homework2/Problem2_3/FAST edge detector.py | 100 +++++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 Homework2/Problem2_3/200_redCell.png create mode 100644 Homework2/Problem2_3/BRIEF descriptor.py create mode 100644 Homework2/Problem2_3/FAST edge detector.py diff --git a/Homework2/Problem2_3/200_redCell.png b/Homework2/Problem2_3/200_redCell.png new file mode 100644 index 0000000000000000000000000000000000000000..5f2028de6074dc77e955f66b08fa2295bfd6d96d GIT binary patch literal 44659 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 FV1n{eHE#d_ literal 0 HcmV?d00001 diff --git a/Homework2/Problem2_3/BRIEF descriptor.py b/Homework2/Problem2_3/BRIEF descriptor.py new file mode 100644 index 0000000..664e384 --- /dev/null +++ b/Homework2/Problem2_3/BRIEF descriptor.py @@ -0,0 +1,54 @@ + +# coding: utf-8 + +# In[17]: + +import numpy as np +import math +from PIL import Image, ImageDraw +import random + + +givenImg = Image.open('C:\Users\Char\Downloads\\200_redCell.png', 'r').convert('LA') +#givenImg.show() +(width, height) = givenImg.size +imgData = list(givenImg.getdata()) + +numOfPairs = 20; +samplingPairs = makeSamplingPair(numOfPairs, width, height) +print samplingPairs + +BRIEFDescriptor = makeBRIEFDescriptor(samplingPairs, numOfPairs, imgData, width, height) +print BRIEFDescriptor + + +# In[15]: + +def makeSamplingPair(numOfPairs, width, height): + samplingPairs = list(); + + for i in range(numOfPairs): + X1 = int(width*random.random()); + Y1 = int(height*random.random()); + X2 = int(width*random.random()); + Y2 = int(height*random.random()); + currSamplingPair =[[X1, Y1], [X2, Y2]] + samplingPairs.append(currSamplingPair); + + return samplingPairs; + + +# In[11]: + +def makeBRIEFDescriptor(samplingPairs, numOfPairs, imgData, width, height): + BRIEFDescriptor = list(); + for currPair in samplingPairs: + valueInPt1 = imgData[currPair[0][0]+width*currPair[0][1]][0]; + valueInPt2 = imgData[currPair[1][0]+width*currPair[1][1]][0]; + if(valueInPt1 > valueInPt2): + BRIEFDescriptor.append(1); + else: + BRIEFDescriptor.append(0); + + return BRIEFDescriptor; + diff --git a/Homework2/Problem2_3/FAST edge detector.py b/Homework2/Problem2_3/FAST edge detector.py new file mode 100644 index 0000000..0325e85 --- /dev/null +++ b/Homework2/Problem2_3/FAST edge detector.py @@ -0,0 +1,100 @@ + +# coding: utf-8 + +# In[9]: + +import numpy as np +from PIL import Image, ImageDraw + + +givenImg = Image.open('C:\Users\Char\Downloads\\200_redCell.png', 'r').convert('LA') +givenImg.show() + + + + +(width, height) = givenImg.size +pixels = list(givenImg.getdata()) +threshold = 10 +cornerList = FAST9CornerDetector(pixels, width, height, threshold) + +draw = ImageDraw.Draw(givenImg) + +for currCorner in cornerList: + draw.ellipse((currCorner[0]-1, currCorner[1]-1, currCorner[0]+1, currCorner[1]+1), + fill=0) + +givenImg.show() + + +# In[2]: + +def FAST9CornerDetector(pixelList, width, height, threshold): + cornerCoordList = list(); + for currX in range(width): + for currY in range(height): + isCorner = judgeCornerPoint(currX, currY, pixelList, width, height, threshold); + if(isCorner == True): + cornerCoordList.append([currX, currY]); + + return cornerCoordList; + + + +# In[3]: + +def judgeCornerPoint(currX, currY, pixelList, width, height, threshold): + SurrondingPoints = [[currX, currY+3], [currX+1, currY+3], [currX+2, currY+2], + [currX+3, currY+1], [currX+3, currY], [currX+3, currY-1], [currX+2, currY-2], + [currX+1, currY-3], [currX, currY-3], [currX-1, currY-3], [currX-2, currY-2], + [currX-3, currY-1], [currX-3, currY], [currX-3, currY+1], [currX-2, currY+2], + [currX-1, currY+3]] + + brightOfCurrCoord = pixelList[currX+currY*width][0]; + continuousState = 0; + + for surrCoord in SurrondingPoints: + if ((surrCoord[0] >= 0) & (surrCoord[1] >= 0) & (surrCoord[0] < width) & (surrCoord[1] < height)): + brightOfSurrCoord = pixelList[surrCoord[0]+surrCoord[1]*width][0]; + if(continuousState >= 0): + if(brightOfSurrCoord > brightOfCurrCoord+threshold): + continuousState = continuousState+1; + elif(brightOfSurrCoord < brightOfCurrCoord-threshold): + continuousState = -1; + else: + continuousState = 0; + else: + if(brightOfSurrCoord > brightOfCurrCoord+threshold): + continuousState=1; + elif(brightOfSurrCoord < brightOfCurrCoord-threshold): + continuousState = continuousState-1; + else: + continuousState = 0; + + if((continuousState == 9)|(continuousState == -9)): + return True; + + if(continuousState > 0): + for i in range(9-continuousState): + surrCoord = SurrondingPoints[i] + if ((surrCoord[0] >= 0) & (surrCoord[1] >= 0) & (surrCoord[0] < width) & (surrCoord[1] < height)): + brightOfSurrCoord = pixelList[surrCoord[0]+surrCoord[1]*width][0]; + if(brightOfSurrCoord > brightOfCurrCoord+threshold): + continuousState = continuousState+1; + + if(continuousState == 9): + return True; + + if(continuousState < 0): + for i in range(9+continuousState): + surrCoord = SurrondingPoints[i] + if ((surrCoord[0] >= 0) & (surrCoord[1] >= 0) & (surrCoord[0] < width) & (surrCoord[1] < height)): + brightOfSurrCoord = pixelList[surrCoord[0]+surrCoord[1]*width][0]; + if(brightOfSurrCoord > brightOfCurrCoord+threshold): + continuousState = continuousState-1; + + if(continuousState == -9): + return True; + + return False; +