← Back to team overview

sikuli-driver team mailing list archive

Re: [Question #649152]: what does it mean background at the edges

 

Question #649152 on Sikuli changed:
https://answers.launchpad.net/sikuli/+question/649152

    Status: Open => Answered

RaiMan proposed the following answer:
Since it is so easy, people tend to capture their images rather broadly
than putting the cutting line very near around the main aspects (e.g. a
button).

"towards the edges" in this case means the the edges of the captured image, an example:
- you have a button measuring 300 x 100 pixels (width x height) at the exact bounds of the button
- you capture broadly around an get an image measuring 500 x 200
- this means you have a "surrounding background towards the edges" of top/bottom each 50 pixel and left/right each 100 pixel (supposing the capturing has the button centered)

now the mentioned background-ration:
- image if interest has 300x100 = 30.000 pixels
- surrounding background is 2x300x50 + 2x200x100 = 30.000 + 40.000 = 70.000 pixels

since the search algorithm is a statistical calculation over all pixels of the captured image (see the matchTemplate() feature of OpenCV) in this case, the weight of the background is about times 2.3 to the real button pixels.
So if only a few pixels in the background of the current search region differ from the situation, where the image was captured, this will influence the match score, the more the surrounding background differs around the button borders.

My experience is that the surrounding background should be less then 20% of the total image pixels. 
In this case this maximum would be about 7.000 pixels, meaning that you have to capture as near as about 4 pixels around the button edges, which you would normally only do, if you knew about the possible problems.

if interested - these are the formulas:
- size of image of interest: imgInterest
- size of captured image: imgComplete

- the challenge:
imgInterest = 0.8 x imgComplete

- the max background
maxBack = (5 * imgInterest) / 4 - imgInterest

- supposing even pixels around image of interest (edgePixels):
(2 * imageInterestWidth + 2 * imageInterestHeight) * edgePixels + 4 * edgePixels * edgePixels = maxBack

this can be solved according to the binomial:
a * a + 2 * a * b + b * b = someValue

... and this is a script to calculate the edge pixels
import math
imgInterestW = 300
imgInterestH = 100
imgInterest = imgInterestW * imgInterestH 
maxBack = 5 * imgInterest / 4 - imgInterest
edge = 0 # the edge pixels
# the binomial formula aspects
# a * a + 2 * a * b + b * b = someValue
# (2 * imgInterestWidth + 2 * imgInterestHeight) * edge + 4 * edge * edge = maxBack
# binom2b = (2 * imgInterestW + 2 * imgInterestH)
binomb = imgInterestW + imgInterestH
binombSq = binomb * binomb
# binom2b * edge + 4 * edge * edge = maxBack
# binombSq + binom2b * edge + 4 * edge * edge = maxBack + binombSq
# (binomb + 2 * edge) * (binomb + 2 * edge) = maxBack + binombSq
# (binomb + 2 * edge) = math.sqrt(maxBack + binombSq)
edge = (math.sqrt(maxBack + binombSq) - binomb) / 2

print "for an image of interest having %d x %d (width x hight)" % (imgInterestW, imgInterestH)
print "the capture should be maximum %d pixels around" % edge

-- 
You received this question notification because your team Sikuli Drivers
is an answer contact for Sikuli.