18 Ocak 2018 Perşembe

OpenCV Threshold Metodları

getStructuringElement metodu
Bu metod aslında Threadhold'lara dahil değil ancak yazı ile birlikte olsun istedim. Açıklaması şöyle
First we define our structural element to use in our morphological operation. We will use the getStructuringElement function to define a structural rectangular element with a 17 x 3 dimension size in our case; this may be different in other image sizes: Mat element =getStructuringElement(MORPH_RECT, Size(17, 3)); And use this structural element in a close morphological operation using the morphologyEx function: morphologyEx(img_threshold, img_threshold, CV_MOP_CLOSE, element); After applying these functions, we have regions in the image that could contain a plate; however, most of the regions will not contain license plates. These regions can be split with a connected-component analysis or by using the findContours function. This last function retrieves the contours of a binary image with different methods and results. We only need to get the external contours with any hierarchical relationship and any polygonal approximation results:
Birinci parametre MORP_RECT, MORPH_ELLIPSE, MORPH_CIRCLE  olabilir.
Şöyle yaparız.
// create structuring element that will be used to "dilate" and "erode" image.
// the element chosen here is a 3px by 3px rectangle.
// As a rule of thumb you want to dilate with larger element to make sure
// the object is nicely visible

erode (img,img,getStructuringElement( MORPH_RECT, Size(3,3)));
dilate(img,img,getStructuringElement( MORPH_RECT, Size(3,3)));
Şöyle yaparız.
// connect horizontally oriented regions
Mat connected;
morphKernel = getStructuringElement(MORPH_RECT, Size(10, 1));
morphologyEx(img, connected, MORPH_CLOSE, morphKernel);
inRange metodu
İmzası şöyle. Belirtilen aralıktaki renkleri geri verir.
void inRange(InputArray src, InputArray lowerb, InputArray upperb,
  OutputArray dst)
RGB için şöyle yaparız.
image = cv::imread("./sample.png"); #For reading the image in RGB format

cv::Mat dst;
# For segmenting the image in RGB format.
cv::inRange(image, cv::Scalar(100, 10, 60), cv::Scalar(120, 50, 70),
 dst);
RGBA çin şöyle yaparız.
# For segmenting the image in RGBA format
cv::inRange(image, cv::Scalar(100, 10, 60, 10), cv::Scalar(120, 50, 70, 250),
 dst);
Gray için şöyle yaparız.
# For segmenting the image in Gray format
cv::inRange(image, cv::Scalar(110), cv::Scalar(150), dst);
Örnek
Threshold ile nesneleri ayırdıktan sonra erode ve dilate kullanarak şöyle yaparız.
// Color thresholds
cv::Scalar minColor(141, 0, 0);
cv::Scalar maxColor(255, 255, 124);
cv::Mat filtered;

// Isolate the interesting range of colors
cv::inRange(image, minColor, maxColor, filtered);
filtered.convertTo(filtered, CV_8U);

// Apply opening (erode then dilate)
cv::Mat opening;
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
cv::morphologyEx(filtered, opening, cv::MORPH_OPEN, kernel, cv::Point(-1,-1), 2);

// Compute the distance to the closest zero pixel (euclidian)
cv::Mat distance;
cv::distanceTransform(opening, distance, CV_DIST_L2, 5);
cv::normalize(distance, distance, 0, 1.0, cv::NORM_MINM
max metodu
Örnek ver

threshold metodu
Belirtilen değerden büyük olanları sıfırlar.
Örnek
Elimizde şöyle bir kod olsun
void pos(cv::Mat &src, cv::Mat &dst)
{           
  cv::threshold(-src, dst, 0, 0, CV_THRESH_TRUNC);
  dst = -dst;
  return;
}
Girdi olarak şunu veririz.
[-3, -2, -1;
 0, 1, 2]
Çıktı olarak şunu alırız.
[0, 0, 0;
 0, 1, 2]


Hiç yorum yok:

Yorum Gönder