morphologyex 参数
基于Opencv实现颜色识别

基于Opencv实现颜⾊识别彩⾊模型数字图像处理中常⽤的采⽤模型是RGB(红,绿,蓝)模型和HSV(⾊调,饱和度,亮度),RGB⼴泛应⽤于彩⾊监视器和彩⾊视频摄像机,我们平时的图⽚⼀般都是RGB模型。
⽽HSV模型更符合⼈描述和解释颜⾊的⽅式,HSV的彩⾊描述对⼈来说是⾃然且⾮常直观的。
HSV模型HSV模型中颜⾊的参数分别是:⾊调(H:hue),饱和度(S:saturation),亮度(V:value)。
由A. R. Smith在1978年创建的⼀种颜⾊空间, 也称六⾓锥体模型(Hexcone Model)。
(1)⾊调(H:hue):⽤⾓度度量,取值范围为0°~360°,从红⾊开始按逆时针⽅向计算,红⾊为0°,绿⾊为120°,蓝⾊为240°。
它们的补⾊是:黄⾊为60°,青⾊为180°,品红为300°;(2)饱和度(S:saturation):取值范围为0.0~1.0,值越⼤,颜⾊越饱和。
(3)亮度(V:value):取值范围为0(⿊⾊)~255(⽩⾊)RGB转成HSV设 (r, g, b) 分别是⼀个颜⾊的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。
设 max 等价于 r, g 和 b 中的最⼤者。
设 min 等于这些值中的最⼩者。
要找到在 HSV 空间中的 (h, s, v) 值,这⾥的 h ∈ [0, 360)是⾓度的⾊相⾓,⽽ s, v ∈ [0,1] 是饱和度和亮度,⽅法如下:max=max(R,G,B)min=min(R,G,B)if R = max, H = (G-B)/(max-min)if G = max, H = 2 + (B-R)/(max-min)if B = max, H = 4 + (R-G)/(max-min)H = H * 60if H < 0, H = H + 360V=max(R,G,B)S=(max-min)/maxOpenCV下有个函数可以直接将RGB模型转换为HSV模型,OpenCV中H∈ [0, 180), S ∈ [0, 255], V ∈ [0, 255]。
opencv——morphologyEx开运算、闭运算、形态学梯度、顶帽、黑帽

opencv——morphologyEx开运算、闭运算、形态学梯度、顶帽、⿊帽开运算:先腐蚀后膨胀。
能够排除⼩亮点。
闭运算:先膨胀后腐蚀。
能够排除⼩⿊点。
形态学梯度:膨胀图 — 腐蚀图。
对⼆值图像进⾏这⼀操作,可将图块的边缘突出出来,故可⽤来保留物体边缘轮廓。
顶帽:原图 — 开运算结果。
可以认为是找到那些被开运算排除的⼩亮点。
⿊帽:闭运算结果 — 原图。
可以认为是找到那些被闭运算排除的⼩⿊点。
为了⽅便,opencv 将这些操作集合到了⼀个函数中 morphologyEx。
要实现不同操作,仅需改变其第三个成员变量形态学运算标识符。
形态学滤波:morphologyEx 函数void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1, -1), intiterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue =morphologyDefaultBorderValue());src,输⼊图像,即原图像,填 Mat 类的对象即可。
dst,⽬标图像,需要和原图⽚有⼀样的尺⼨和类型。
op,形态学运算的类型。
MORPH_ERODE = 0, //腐蚀MORPH_DILATE = 1, //膨胀MORPH_OPEN = 2, //开操作MORPH_CLOSE = 3, //闭操作MORPH_GRADIENT = 4, //梯度操作MORPH_TOPHAT = 5, //顶帽操作MORPH_BLACKHAT = 6, //⿊帽操作kernel,膨胀操作的核。
当为 NULL 时,表⽰的是使⽤参考点位于中⼼,⼤⼩ 3×3 的核。
⼀般⽤函数 getStructuringElement 配合这个参数使⽤。
指静脉识别代码

指静脉识别代码指静脉识别是一种生物特征识别技术,它通过识别人体手指的静脉纹理来实现身份认证和授权。
相比于传统的密码、卡片等身份认证方式,指静脉识别具有更高的准确性、更强的安全性和更便捷的使用体验。
在金融、医疗、政务等领域得到了广泛应用。
1. 指静脉识别原理指静脉识别是基于人体生物特征进行身份认证和授权的技术。
每个人手指上的静脉纹理都是独一无二的,就像人类的DNA一样。
当手指放置在读取器上时,读取器会发射近红外光线,并通过摄像头捕捉图像。
然后,计算机会对图像进行处理和分析,提取出图像中的指静脉信息,并与预先存储在数据库中的用户信息进行比对,从而完成身份认证或授权。
2. 指静脉识别技术优势2.1 高准确性由于每个人手指上的静脉纹理都是独一无二的,因此指静脉识别技术具有非常高的准确性。
根据相关研究,指静脉识别的错误率只有万分之一左右,远远低于其他生物特征识别技术。
2.2 高安全性指静脉识别技术具有非常高的安全性。
由于指静脉信息是内部生物特征,不易被模拟或复制。
此外,指静脉识别技术还可以检测出假体、假手指等欺骗行为,进一步提高了系统的安全性。
2.3 便捷易用相比于传统的密码、卡片等身份认证方式,指静脉识别具有更便捷、更易用的特点。
用户只需要将手指放置在读取器上即可完成身份认证或授权,无需记忆复杂的密码或携带卡片等物品。
3. 指静脉识别应用场景3.1 金融领域在金融领域,指静脉识别技术被广泛应用于ATM机、移动支付等场景中。
通过使用指静脉识别技术进行身份认证和授权,可以有效防止银行卡被盗刷、密码被破解等安全问题。
3.2 医疗领域在医疗领域,指静脉识别技术被应用于电子病历管理、药品配送等场景中。
通过使用指静脉识别技术,可以确保医疗信息的安全性和准确性,同时也可以提高医院工作效率。
3.3 政务领域在政务领域,指静脉识别技术被应用于身份证明、公共服务等场景中。
通过使用指静脉识别技术进行身份认证和授权,可以有效防止虚假身份证明和欺诈行为。
C++中实现OpenCV图像分割与分水岭算法

C++中实现OpenCV图像分割与分⽔岭算法分⽔岭算法是⼀种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从⽽将在空间位置上相近并且灰度值相近的像素点互相连接起来构成⼀个封闭的轮廓,封闭性是分⽔岭算法的⼀个重要特征。
API介绍void watershed( InputArray image, InputOutputArray markers );参数说明:image: 必须是⼀个8bit 3通道彩⾊图像矩阵序列markers: 在执⾏分⽔岭函数watershed之前,必须对第⼆个参数markers进⾏处理,它应该包含不同区域的轮廓,每个轮廓有⼀个⾃⼰唯⼀的编号,轮廓的定位可以通过Opencv中findContours⽅法实现,这个是执⾏分⽔岭之前的要求。
算法会根据markers传⼊的轮廓作为种⼦(也就是所谓的注⽔点),对图像上其他的像素点根据分⽔岭算法规则进⾏判断,并对每个像素点的区域归属进⾏划定,直到处理完图像上所有像素点。
⽽区域与区域之间的分界处的值被置为“-1”,以做区分。
我们将⼀个如何使⽤距离变换和分⽔岭分割相互接触的物体的例⼦。
考虑⼀下下⾯的硬币图像,这些硬币相互接触。
即使你去阈值化它,它也会互相碰触。
我们从找到硬币的⼤概估计值开始。
为此,我们可以利⽤⼤津的⼆值化。
#include<iostream>#include<opencv2\opencv.hpp>using namespace std;using namespace cv;int main() {Mat gray, thresh;Mat img = imread("coins.jpg");cvtColor(img, gray, COLOR_BGR2GRAY);threshold(gray, thresh, 0, 255, THRESH_BINARY_INV+CV_THRESH_OTSU);imshow("Otst阈值图像", thresh);waitKey(0);return 0;}阈值后的图像如下所⽰:现在需要去除图像中任何微⼩的⽩⾊噪声。
车牌识别(一)-车牌定位

车牌识别(⼀)-车牌定位在对车牌识别过程中,常⽤的⽅法有:基于形状、基于⾊调、基于纹理、基于⽂字特征等⽅法。
⾸先基于形状,在车牌中因为车牌为形状规格的矩形,所以⽬的转化为寻找矩形特征,常常是利⽤车牌长宽⽐例特征、占据图像的⽐例等。
基于⾊调,国内的车牌往往是蓝底⽩字,可以采⽤图像的⾊调或者饱和度特征,进⼊⽣成⼆值图,定位车牌位置。
基于纹理特征⾃⼰还没有基础到。
基于⽂字特征往往是根据⽂字轮廓特征进⾏识别,原理是基于相邻⽂字轮廓特征、⽐例进⾏定位车牌位置。
⼀、图像⼆值化正如前⾯⽂章所⾔,⾸先进⾏获取图像⼆值化特征,本⽂采取了根据图像亮度特征,提⾼对⽐度,进⾏可以清晰获取⽂字的图像,为下⼀步的⽂字轮廓识别打好基础。
1.1 算法流程伪代码1、图像转化为HSV图像,获取V通道图像2、提⾼对⽐度3、V图像⾼斯滤波,去除噪声4、图像⼆值化程序源码:def get_colorvalue(image):height, width, shape = image.shapeimage_hsv = np.zeros((height,width), np.uint8)image_hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)image_hue, image_saturation, image_value = cv2.split(image_hsv)return image_valuedef enhance_contrast(image):kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))img_tophat = cv2.morphologyEx(image, cv2.MORPH_TOPHAT,kernel)img_blackhat = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel)image_plus_tophat = cv2.add(image, img_tophat)image_plus_blackhat_minus_blackhat = cv2.subtract(image_plus_tophat, img_blackhat)return image_plus_blackhat_minus_blackhatdef preprocess(srcimage):image_value = get_colorvalue(srcimage)image_enhance = enhance_contrast(image_value)image_blur = cv2.GaussianBlur(image_enhance, (5,5), 0)# _, image_binary = cv2.threshold(image_blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)_, image_binary = cv2.threshold(image_blur, 100, 255, cv2.THRESH_BINARY )cv2.imwrite('image_binary.png',image_binary)return image_binary1.2 算法分析在实验中在获取通道图像时,发现可以利⽤图像饱和度图像进⾏定位。
基于深度摄像头的障碍物检测(realsense+opencv)

基于深度摄像头的障碍物检测(realsense+opencv)前⼏天⽼⼤给了个任务,让我帮slam组写⼀个基于深度摄像头的障碍物检测,捣⿎了两天弄出来了,效果还不错,就在这⾥记⼀下了。
代码的核⼼思路是⾸先通过⼆值化,将⼀⽶之外的安全距离置零不考虑,然后通过开运算去除掉⼀些噪点(这个后来发现不⼀定有必要),在求出所有障碍物的凸包,这个时候要计算⾯积,当⾯积⼩于⼀定的阈值的时候不予考虑,最终输出障碍物的凸包坐标。
//find_obstacle函数是获取深度图障碍物的函数,返回值是每个障碍物凸包的坐标,参数⼀depth是realsense返回的深度图(ushort型),//参数⼆thresh和参数三max_thresh,是⼆值化的参数,参数四是凸包的最⼩有效⾯积,⼩于这个⾯积的障碍物可以视为噪点。
//函数⾸先筛选掉距离⼤于安全距离的点,然后进⾏阀值化和开运算减少⼀下噪点,⽤findContours得到轮廓图,最后⽤convexHull得到每个障碍物的凸包,最后返回坐标//mask_depth函数是对深度图⼆值化,第⼀个参数image是原图,第⼆个参数th是⽬标图,第三个参数throld是最⼤距离,单位是mm,⼤于这个距离//即为安全,不⽤考虑。
#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include "RSWrapper.h"#include "opencv2/imgproc/imgproc.hpp"using namespace std;using namespace cv;void mask_depth(Mat &image,Mat& th,int throld=1000){int nr = image.rows; // number of rowsint nc = image.cols; // number of columnsfor (int i = 0; i<nr; i++){for (int j = 0; j<nc; j++) {if (image.at<ushort>(i, j)>throld)th.at<ushort>(i, j) = 0;}}}vector<vector<Point> > find_obstacle(Mat &depth, int thresh = 20, int max_thresh = 255, int area = 500){Mat dep;depth.copyTo(dep);mask_depth(depth, dep, 1000);dep.convertTo(dep, CV_8UC1, 1.0 / 16);//imshow("color", color);imshow("depth", dep);Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));//核的⼤⼩可适当调整Mat out;//进⾏开操作morphologyEx(dep, out, MORPH_OPEN, element);//dilate(dhc, out, element);//显⽰效果图imshow("opencv", out);Mat src_copy = dep.clone();Mat threshold_output;vector<vector<Point> > contours;vector<Vec4i> hierarchy;RNG rng(12345);/// 对图像进⾏⼆值化threshold(dep, threshold_output, thresh, 255, CV_THRESH_BINARY);//mask_depth(src, threshold_output);/// 寻找轮廓findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));/// 对每个轮廓计算其凸包vector<vector<Point> >hull(contours.size());vector<vector<Point> > result;for (int i = 0; i < contours.size(); i++){convexHull(Mat(contours[i]), hull[i], false);}/// 绘出轮廓及其凸包Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);for (int i = 0; i< contours.size(); i++){if (contourArea(contours[i]) < area)//⾯积⼩于area的凸包,可忽略continue;result.push_back(hull[i]);Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); drawContours(drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0, Point()); drawContours(drawing, hull, i, color, 1, 8, vector<Vec4i>(), 0, Point());}imshow("contours", drawing);return result;}int main(int argc, char* argv[]){Mat dhc;Mat dep;int idxImageRes = 1, idxFrameRate = 30;RSWrapper depthCam(idxImageRes, idxImageRes, idxFrameRate, idxFrameRate); if (!depthCam.init()){std::cerr << "Init. RealSense Failure!" << std::endl;return -1;}while (true){//Get RGB-D Imagescv::Mat color, depth;bool ret = depthCam.capture(color, depth);if (!ret) {std::cerr << "Get realsense camera data failure!" << std::endl;break;}vector<vector<Point> > result;result = find_obstacle(depth, 20, 255, 500);if (cvWaitKey(1) == 27)break;}depthCam.release();}。
opencv库常用函数

opencv库常⽤函数常⽤opencv函数:1、cv2.line():画线——参数依次为:图⽚路径,起点和终点坐标值,颜⾊(rgb),线条宽度(像素)2、dst = cvtColor(src,code,dst=None,dstCn=None):颜⾊空间转换函数——参数依次为(原图像,color转化代码,输出图像,输出通道), 返回转换后的图像3、ret, dst = cv2.threshold(src, thresh, maxval, type):固定阈值⼆值化——src:输⼊图,只能输⼊单通道图像,通常来说为灰度图dst:输出图thresh:阈值maxval:当像素值超过了阈值(或者⼩于阈值,根据type来决定),所赋予的值type:⼆值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV4、cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]]) :查找检测物体的轮廓opencv2返回两个值:contours:hierarchy。
注:opencv3会返回三个值,分别是img, countours, hierarchy参数:第⼀个参数是寻找轮廓的图像;第⼆个参数表⽰轮廓的检索模式,有四种(本⽂介绍的都是新的cv2接⼝):cv2.RETR_EXTERNAL 表⽰只检测外轮廓cv2.RETR_LIST 检测的轮廓不建⽴等级关系cv2.RETR_CCOMP 建⽴两个等级的轮廓,上⾯的⼀层为外边界,⾥⾯的⼀层为内孔的边界信息。
如果内孔内还有⼀个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE 建⽴⼀个等级树结构的轮廓。
第三个参数method为轮廓的近似办法cv2.CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1cv2.CHAIN_APPROX_SIMPLE 压缩⽔平⽅向,垂直⽅向,对⾓线⽅向的元素,只保留该⽅向的终点坐标,例如⼀个矩形轮廓只需4个点来保存轮廓信息cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS 使⽤teh-Chinl chain 近似算法返回值cv2.findContours()函数返回两个值,⼀个是轮廓本⾝,还有⼀个是每条轮廓对应的属性。
形态学滤波(2):开运算、闭运算、形态学梯度、顶帽、黑帽

形态学滤波(2):开运算、闭运算、形态学梯度、顶帽、⿊帽⼀、开运算开运算,就是先腐蚀后膨胀的过程数学表达式: dst = open(src,element) = dilate(erode(src, element))开运算可以⽤来消除⼩物体,在纤细点处分离物体,并且在平滑较⼤物体的边界的同时不明显改变其⾯积。
⼆、闭运算闭运算,就是先膨胀后腐蚀的过程数学表达式: dst = open(src,element) = erode(dilate(src, element))闭运算可以⽤来排除⼩型⿊洞(⿊⾊区域)三、形态学梯度形态学梯度,就是膨胀图与腐蚀图之差数学表达式: dst = morph-grad(src,element) = dilate(src, element) - erode(src, element)对⼆值图进⾏这⼀操作可以将团块的边缘突出出来,我们可以⽤形态学梯度来保留物体的边缘轮廓四、顶帽顶帽(礼帽)运算,就是原图像与“开运算”的结果图之差数学表达式: dst = tophat(src,element) = src - open(src,element)因为开运算带来的结果是放⼤了裂缝或者局部低亮度的区域。
因此从原图中减去开运算后的图,得到的效果图突出了⽐原图轮廓周围的区域更明亮的区域,且这⼀操作与选择的核的的⼤⼩相关。
顶帽运算往往⽤来分离⽐临近点亮⼀些的斑块,在⼀幅图像具有⼤幅的背景,⽽微⼩物品⽐较有规律的情况下,可以使⽤顶帽运算进⾏背景提取五、⿊帽⿊帽运算,就是“闭运算”的结果图与原图像之差数学表达式: dst = blackhat(src,element) = close(src,element) - src⿊帽运算后的效果图突出了⽐原图轮廓周围的区域更暗的区域,且这⼀操作和选择的核的⼤⼩相关⿊帽运算⽤来分离⽐临近点暗⼀些的斑块,效果图有着⾮常完美的轮廓六、核⼼函数:morphologyEx()1void morphologyEx( InputArray src, OutputArray dst,2int op, InputArray kernel,3 Point anchor = Point(-1,-1), int iterations = 1,4int borderType = BORDER_CONSTANT,5const Scalar& borderValue = morphologyDefaultBorderValue() );1 #include<opencv2/opencv.hpp>2 #include<iostream>34using namespace std;5using namespace cv;67 Mat g_srcImage, g_dstImage;8int g_nElementShap = MORPH_RECT; //元素结构的形状910//变量接收的TrackBar位置参数11int g_nMaxIterationNum = 10;12int g_nOpenCloseNum = 0;13int g_nErodeDilateNum = 0;14int g_nTopBlackHatNum = 0;1516static void on_OpenClose(int, void *); //回调函数17static void on_ErodeDilate(int, void *);18static void on_TopBlackHat(int, void *);192021int main()22 {23//载⼊原图24 g_srcImage = imread("C:\\Users\\Administrator\\Pictures\\Camera Roll\\05.jpg");25if (!g_srcImage.data) {26 cout << "图⽚载⼊失败!" << endl;27return false;28 }2930//显⽰原始图31 namedWindow("【原始图】");32 imshow("【原始图】", g_srcImage);3334//创建三个窗⼝35 namedWindow("【开运算/闭运算】", 1);36 namedWindow("【腐蚀/膨胀】", 1);37 namedWindow("【顶帽/⿊帽】", 1);3839//分别为三个窗⼝创建滚动条40 createTrackbar("迭代值", "【开运算/闭运算】", &g_nOpenCloseNum, g_nMaxIterationNum * 2 + 1, on_OpenClose);41 createTrackbar("迭代值", "【腐蚀/膨胀】", &g_nErodeDilateNum, g_nMaxIterationNum * 2 + 1, on_ErodeDilate);42 createTrackbar("迭代值", "【顶帽/⿊帽】", &g_nTopBlackHatNum, g_nMaxIterationNum * 2 + 1, on_TopBlackHat); 4344//轮询获取按键信息45while (1)46 {47int c;4849//执⾏回调函数50 on_OpenClose(g_nOpenCloseNum, 0);51 on_ErodeDilate(g_nErodeDilateNum, 0);52 on_TopBlackHat(g_nTopBlackHatNum, 0);5354//获取按键55 c = waitKey(0);5657//按下键盘Q或者ESC,程序退出58if (c == 'q' || c == 27)59break;60//按下键盘按键1,使⽤椭圆(Elliptic)结构元素MORPH_ELLIPSE61if (c == 'a')62 g_nElementShap = MORPH_ELLIPSE;63//按下键盘按键2,使⽤矩形(Rectangle)结构元素MORPH_RECT64if (c == 'b')65 g_nElementShap = MORPH_RECT;66//按下键盘按键3,使⽤⼗字形(Cross-shaped)结构元素MORPH_CROSS67if (c == 'c')68 g_nElementShap = MORPH_CROSS;69//按下键盘按键space,在矩形、椭圆、⼗字形结构元素中循环70if (c == '')71 g_nElementShap = (g_nElementShap + 1) % 3;72 }73return0;74 }75static void on_OpenClose(int, void *) {76//偏移量的定义77int offset = g_nOpenCloseNum - g_nMaxIterationNum; //偏移量78int Absolute_offset = offset > 0 ? offset : -offset; //偏移量的绝对值79//⾃定义核80 Mat element = getStructuringElement(g_nElementShap, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset)); 8182//进⾏操作83if (offset < 0)84 morphologyEx(g_srcImage, g_dstImage, MORPH_OPEN, element);85else86 morphologyEx(g_srcImage, g_dstImage, MORPH_CLOSE, element);8788//显⽰图像89 imshow("【开运算/闭运算】", g_dstImage);90 }9192static void on_ErodeDilate(int, void *) {93int offset = g_nOpenCloseNum - g_nMaxIterationNum; //偏移量94int Absolute_offset = offset > 0 ? offset : -offset; //偏移量的绝对值95//⾃定义核96 Mat element = getStructuringElement(g_nElementShap, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset)); 9798//进⾏操作99if (offset < 0)100 erode(g_srcImage, g_dstImage, element);101else102 dilate(g_srcImage, g_dstImage, element);103104//显⽰图像105 imshow("【腐蚀/膨胀】", g_dstImage);106 }107108static void on_TopBlackHat(int, void *) {109int offset = g_nOpenCloseNum - g_nMaxIterationNum; //偏移量110int Absolute_offset = offset > 0 ? offset : -offset; //偏移量的绝对值111//⾃定义核112 Mat element = getStructuringElement(g_nElementShap, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset)); 113114//进⾏操作115if (offset < 0)116 morphologyEx(g_srcImage, g_dstImage, MORPH_TOPHAT, element);117else118 morphologyEx(g_srcImage, g_dstImage, MORPH_BLACKHAT, element);119120//显⽰图像121 imshow("【顶帽/⿊帽】", g_dstImage);122 }123。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
morphologyex 参数
在图像处理中,MorphologyEx是一种常用的图像处理技术,用于图像的形态学操作。
形态学操作是基于图像的形状和结构来进行处理的。
MorphologyEx函数通常用于图像的腐蚀、膨胀、开运算、闭运算等操作。
下面我会从不同的角度来解释MorphologyEx函数的参数。
1. 原始图像,MorphologyEx函数的第一个参数通常是输入的原始图像,这是需要进行形态学操作的图像。
2. 目标图像,MorphologyEx函数的第二个参数是输出的目标图像,这是进行形态学操作后得到的结果图像。
3. 形态学操作类型,MorphologyEx函数的第三个参数是形态学操作的类型,可以是腐蚀、膨胀、开运算、闭运算等。
4. 结构元素,MorphologyEx函数的第四个参数是结构元素,它定义了进行形态学操作时使用的模板形状和大小。
5. 锚点,MorphologyEx函数的第五个参数是锚点,它指定了
结构元素的锚点位置,通常位于结构元素的中心。
6. 迭代次数,MorphologyEx函数的第六个参数是迭代次数,
用于指定形态学操作的迭代次数,可以对形态学操作进行多次迭代
处理。
通过合理设置这些参数,可以对图像进行不同形式的形态学操作,从而达到去噪、边缘检测、图像增强等目的。
在实际应用中,
根据具体的图像处理需求,可以灵活调整MorphologyEx函数的参数,以获得最佳的处理效果。