Development of the ocr part of AOI
Samo Penic
2018-11-16 9efc18e0eed88475c205abf9fc564ee0f5c73cb6
sid enhancement works
1 files added
3 files modified
104 ■■■■■ changed files
.idea/sonarIssues.xml 15 ●●●●● patch | view | raw | blame | history
Ocr.py 5 ●●●●● patch | view | raw | blame | history
aoiOcr.py 1 ●●●● patch | view | raw | blame | history
sid_process.py 83 ●●●●● patch | view | raw | blame | history
.idea/sonarIssues.xml
@@ -3,6 +3,16 @@
  <component name="issues">
    <option name="index">
      <map>
        <entry key="/Dummy.txt">
          <value>
            <set />
          </value>
        </entry>
        <entry key="/Python Console">
          <value>
            <set />
          </value>
        </entry>
        <entry key="$PROJECT_DIR$/Ocr.py">
          <value>
            <set />
@@ -13,6 +23,11 @@
            <set />
          </value>
        </entry>
        <entry key="$PROJECT_DIR$/sid_process.py">
          <value>
            <set />
          </value>
        </entry>
      </map>
    </option>
  </component>
Ocr.py
@@ -1,4 +1,5 @@
from pyzbar.pyzbar import decode
from sid_process import enhanceSID
import cv2
import numpy as np
import math
@@ -210,3 +211,7 @@
                black = totpx - cv2.countNonZero(roi)
                oneline.append(black / totpx)
            self.answerMatrix.append(oneline)
    def get_enhanced_sid(self):
        es= enhanceSID(self.img[int(0.04*self.imgHeight):int(0.08*self.imgHeight), int(0.7*self.imgWidth):int(0.99*self.imgWidth)])
        cv2.imwrite("enhancedSID.png",es)
aoiOcr.py
@@ -10,3 +10,4 @@
print(p.locateUpMarkers())
print(p.locateRightMarkers())
print(p.answerMatrix)
p.get_enhanced_sid()
sid_process.py
New file
@@ -0,0 +1,83 @@
import cv2
import numpy as np
from skimage import morphology,img_as_ubyte
"""
  (1) The text is an array of chars (in row-major order) where
 *          each char can be one of the following:
 *             'x': hit
 *             'o': miss
 *             ' ': don't-care
 *      (2) When the origin falls on a hit or miss, use an upper case
 *          char (e.g., 'X' or 'O') to indicate it.  When the origin
 *          falls on a don't-care, indicate this with a 'C'.
 *          The string must have exactly one origin specified.
 *      (3) The advantage of this method is that the text can be input
 *          in a format that shows the 2D layout of the Sel; e.g.,
    :::: AND ::::
   (10) The sequence string is formatted as follows:
 *            ~ An arbitrary number of operations,  each separated
 *              by a '+' character.  White space is ignored.
 *            ~ Each operation begins with a case-independent character
 *              specifying the operation:
 *                 d or D  (dilation)
 *                 e or E  (erosion)
 *                 o or O  (opening)
 *                 c or C  (closing)
 *                 r or R  (rank binary reduction)
 *                 x or X  (replicative binary expansion)
 *                 b or B  (add a border of 0 pixels of this size)
 *            ~ The args to the morphological operations are bricks of hits,
 *              and are formatted as a.b, where a and b are horizontal and
 *              vertical dimensions, rsp.
 *            ~ The args to the reduction are a sequence of up to 4 integers,
 *              each from 1 to 4.
 *            ~ The arg to the expansion is a power of two, in the set
 *              {2, 4, 8, 16}.
 *      (11) An example valid sequence is:
 *               "b32 + o1.3 + C3.1 + r23 + e2.2 + D3.2 + X4"
 *           In this example, the following operation sequence is carried out:
 *             * b32: Add a 32 pixel border around the input image
 *             * o1.3: Opening with vert sel of length 3 (e.g., 1 x 3)
 *             * C3.1: Closing with horiz sel of length 3  (e.g., 3 x 1)
 *             * r23: Two successive 2x2 reductions with rank 2 in the first
 *                    and rank 3 in the second.  The result is a 4x reduced pix.
 *             * e2.2: Erosion with a 2x2 sel (origin will be at x,y: 0,0)
 *             * d3.2: Dilation with a 3x2 sel (origin will be at x,y: 1,0)
 *             * X4: 4x replicative expansion, back to original resolution
"""
def kernel(x, y):
    return np.ones((x, y), np.uint8)
def enhanceSID(image):
    image=255-image
    image=img_as_ubyte(image>100)
    cv2.imwrite("enSID0.png", image)
    # Remove noise
    image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel(2,2), iterations=1)
    # Closing. Connect non connected parts
    image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel(5, 5), iterations=2)
    # Again noise removal after closing
    image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel(8,8), iterations=1)
    # Skeletonization
    ##For thinning I am using erosion
    ##image = cv2.erode(image,kernel(4,4),iterations = 40)
    image = img_as_ubyte(morphology.thin(image>128))
    cv2.imwrite("enSID1.png",image)
    # Stub removal (might not be necessary if thinning instead of skeletonize is used above
    # Making lines stronger
    image = cv2.morphologyEx(image, cv2.MORPH_DILATE, kernel(5, 5), iterations=1)
    image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel(10, 10))
    # Thining again
    image = img_as_ubyte(morphology.skeletonize(image>0.5))
    image = cv2.morphologyEx(image, cv2.MORPH_DILATE, kernel(10, 10))
    return image