作業5數學型態影像處理應用 Morphological Image Processing
請撰寫一個程式,利用數學型態學影像處理運算,計算出所附圖像(共三張)每張圖像中 圍棋個數。
圖一
圖二
圖三
一.原理
将图像转为灰阶,然后用otsu法二值化,再用数学形态学对图像进行处理,最后用findContours()和contours.size()计算出棋子个数。二.实现
<1>threshold
C++:
double threshold
(InputArray src, OutputArray dst, double thresh, double maxval, int type)参数:
src:原图像。
dst:结果图像。
thresh:当前阈值。
maxVal:最大阈值,一般为255.
thresholdType:阈值类型,主要有下面几种:
THRESH_BINARY:二进制阈值,。在运用该阈值类型的时候,先要选定一个特定的阈值量,比如:125,这样,新的阈值产生规则可以解释为大于125的像素点的灰度值设定为最大值255,灰度值小于125的像素点的灰度值设定为0。 (value>threshold?255:0)\
THRESH_ BINARY _INV:反二进制阈值。设定一个初始阈值如125,则大于125的设定为0,而小于该阈值的设定为255。 (value>threshold?0:255)
THRESH _TRUNC:截断阈值。同样首先需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。(例如:阈值选取为125,那小于125的阈值不改变,大于125的灰度值(230)的像素点就设定为该阈值)。 (value>threshold?threshold:value)
THRESH _TOZERO:阈值化为0。先选定一个阈值,像素点的灰度值大于该阈值的不进行任何改变;像素点的灰度值小于该阈值的,其灰度值全部变为0。 (value>threshold?value:0)
THRESH _TOZERO _INV:反阈值化为0。原理类似于0阈值,但是在对图像做处理的时候相反,即:像素点的灰度值小于该阈值的不进行任何改变,而大于该阈值的部分,其灰度值全部变为0。 (value>threshold?0:value)
<2> getStructuringElement (获取结构化元素)
Mat getStructuringElement(int shape,
Size ksize,//核大小
Point anchor=Point(-1,-1) //核中心位置,默认位于形状中心处
);
第一个参数shape:MORPH_RECT:矩形
MORPH_CROSS :十字形
MORPH_ELLIPSE :椭圆形
第二个参数ksize:结构性元素的大小 默认为Size( 3,3)
第三个参数Point anchor:核中心位置,默认位于形状中心处
<3>morphologyEx[简单用法]
morphologyEx( InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() );本次用morphologyEx(src,dst,op,kernel);
op:
MORPH_OPEN – 开运算(Opening operation)
MORPH_CLOSE – 闭运算(Closing operation)
MORPH_GRADIENT - 形态学梯度(Morphological gradient)
MORPH_TOPHAT - 顶帽(Top hat)
MORPH_BLACKHAT - 黑帽(Black hat)
kernel:
使用
沒有留言:
張貼留言