形态类型
从OpenCV图像处理基本知识来看,膨胀腐蚀操作后,还有形态操作,如开运算、闭运算、梯度、礼帽与黑帽,感觉很多,其实,本质上就是批处理操作,如
开运算:先腐蚀,再膨胀
闭运算:先膨胀,再腐蚀
这样,从一个原图,就可以得到4种结果,膨胀、腐蚀、开、闭
这4种结果,主体还是与原图差不多的,区别就在于一些噪声点(小的白点)、比较近的区域合并,有利于后续的图像分析
这些结果可以为主体,但很多地方还想看看边界或轮廓,那就需要在这些主体之间进行差值,或是减法操作,这样,结果就是边缘,就象两个大小不同的同心圆,差值后就得到圆环。
OpenCV作为一个基础的或通用的图像处理,那肯定是需要支持不同的需求,象刚说的这些主体差异,功能也是存在了,只不过采用了相应的所谓专业术语来进行称呼,如梯度、礼帽与黑帽
如,梯度 = 膨胀 - 腐蚀
正常的理解,减法嘛,肯定是大减小,直观感觉,膨胀应该比腐蚀大。但从本质上来说,膨胀与腐蚀的结果都是二值图,它的各像素点取值范围都是BYTE,各BYTE相减,结果都还是BYTE。如2-1=1,1-2=-1=0xFE。从结果来看,前者是黑色,后都是白色,也就是反相效果。
上面把膨胀与腐蚀折腾来折腾去,玩出了花,还能怎么玩?这两个再怎么组合,也不能再花了吧,如果要多来几次,那就增加一个迭代次数
但从主体而言,最原始的主体就是原图,所以可以把原图和膨胀腐蚀结果进行减法操作。直观上来说,膨胀 > 原图 > 腐蚀,所以可以这些减。但OpenCV没有直接支持这种操作的功能,如果自己想,实现一个就行了,名字就自己随便取,不象下面说的这个礼帽与黑帽,还要反应半天。
可能是觉得膨胀、原图、腐蚀相邻的差异太小,减的效果不明显,所以OpenCV支持的就是间隔差,如上面提到的
梯度 = 膨胀 - 腐蚀,而
礼帽 = 原图 - 开运算结果
黑帽 = 闭运算结果 - 原图
没有细究开运算结果、原图、闭运算结果的大小关系,从礼帽与黑帽的定义来看,猜测是闭运算结果 > 原图 > 开运算结果
爱谁谁吧
API
OpenCV中,形态操作的API函数是morphologyEx,正常理解
@param src Source image. The number of channels can be arbitrary. The depth should be one of
CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.
@param dst Destination image of the same size and type as source image.
@param op Type of a morphological operation, see #MorphTypes
@param kernel Structuring element. It can be created using #getStructuringElement.
@param anchor Anchor position with the kernel. Negative values mean that the anchor is at the
kernel center.
@param iterations Number of times erosion and dilation are applied.
@param borderType Pixel extrapolation method, see #BorderTypes. #BORDER_WRAP is not supported.
@param borderValue Border value in case of a constant border