Skip to main content

OpenCV : Threshold (Binary Image)

1. What is binary Image?

It is an image made up of two colors, black and white. It is useful to tracking shape or recognizing object.

result binary images

















2. How to make Binary Image?

It can be made by using Threshold method and depending on the type of flag, you can use various binarizations.

double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);

Type :
- THRESH_BINARY : if (src(x,y) > thresh) maxval else 0
- THRESH_BINARY_INV : if (src(x,y) > thresh) 0 else maxval
- THRESH_TRUNC : if(src(x,y) > thresh) threshold else src(x,y)
- THRESH_TOZERO : if (src(x,y) > thresh) src(x,y) else 0

- THRESH_TOZERO_INV : if(src(x,y) > thresh) 0 else src(x,y)

Mat img = imread("./res/text2.jpeg");
Mat gray, binary, binary2, binary3, otsuBinary;
cvtColor(img, gray, CV_RGB2GRAY); // convert to gray color image
// if scalar value is bigger then 128, the value changed to 255(white). else 0(black)
threshold(gray, binary, 128, 255, CV_THRESH_BINARY);
imshow("default binary", binary);


3. Adaptive Threshold

If original image has shadow or gradients, parts of the image are all filled with white or black. This is because one threshold is applied to the entire image. At this time it is more appropriate to use adaptive threshold.
adaptiveThreshold apply the threshold to smaller image divisions.

void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C);

adaptiveMethod :
- ADAPTIVE_THRESH_MEANC (threshold value is the mean of neighbourhood area.)
- ADAPTIVE_THRESH_GAUSSIAN_C (threshold value is the weighted sum of neighbourhood values where weights are a gaussian window)

threshold Type :
- THRESH_BINARY
- THRESH_BINARY_INV


blockSize : 3, 5, 7, 9 ...(odd number)

adaptiveThreshold(gray, binary2, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 5);
adaptiveThreshold(gray, binary3, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 15, 5);
imshow("adaptive Thresh mean", binary2);
imshow("adaptive Thresh gaussian", binary3);


4. Otsu binary

How can you determine the threshold value? If image has two peak of histogram, it can be found between two peaks. Otsu binary helps to calculate the value, so that you do not have to enter a threshold.


GaussianBlur(gray, gray, Size(7,7), 0); // remove noise by making blur
threshold(gray, otsuBinary, 0, 255, CV_THRESH_BINARY + THRESH_OTSU);
imshow("otsu binary", otsuBinary);
waitKey(0);


Comments

Popular posts from this blog

OpenGL SL - Show Video and Image

The simple image is made like this. void  mainImage(  out   vec4  fragColor,  in   vec2  fragCoord ){      // Normalized pixel coordinates (from 0 to 1)      vec2  uv = fragCoord/iResolution.xy;           //uv.x = uv.x - 0.3;      fragColor =  texture (iChannel0, uv); } I think GPU processing has two major steps. Normalizing and Pointing. 1. Normalizing Each pixel has screen coordinate and we need to normalizing from 0.0 to 1.0, because there are many displays with various resolutions around us. We can not manage it at each resolution. It is very troublesome. So we should normalize it :   vec2   uv = fragCoord/iResolution.xy; 2. Pointing I told you each pixel has a screen coordinate. At each coordinate we need to link with sampler's coordinate. Sampler has also coordinate 0.0 to 1.0. As a result, we see the samplers p...

OpenGL SL - Translate, roate, and scale

Translate, rotate and scale are most basic element of image effect. If you didn't understand how make effect at each pixel, please read again before post "Show Video and Image" . 1. Translate Translation means each pixel move parallel on the x, y-axis. In other words, if you want to translate 0.25 on the x-axis, a pixel should point to a distance of -0.25 from the original. Translate ex) void mainImage( out vec4 fragColor, in vec2 fragCoord ){     vec2 uv = fragCoord/iResolution.xy;     if (uv.x < 0.5 ){         // translate to x ( -0.25 )         uv.x += 0.25 ;     } else {         // translate to x ( +0.25 )         uv.x -= 0.25 ;     }     fragColor = texture (iChannel0, uv); } result) 2. Scale Scale also has a  similar concept to parallel translation. If you want to zoom in twice, each pixel s...

OpenGL SL - Mosaic effect

Mosaic effect is similar to lowering the resolution of an image. Let's see example image. And full source code likes below. void mainImage( out vec4 fragColor, in vec2 fragCoord ){     // Normalized pixel coordinates (from 0 to 1)     vec2 uv = fragCoord/iResolution.xy;     if (uv.x > 0.7 && uv.y < 0.4 ){          //left bottoom small image         uv.x -= 0.6 ;         uv *= 2.0 ;         fragColor = texture (iChannel0, uv);         fragColor += vec4 ( 0.2 );         return ;     }     //mosaic effect     uv = uv * 30.0 ;     vec2 uv = floor (uv);     uv = uv/ 30.0 ;     fragColor = texture (iChannel0, uv); } The key function of mosaic effect is "floor" If you want to make it sharper, multiply uv by ...