13-形态学操作应用-提取水平与垂直线

掌握

1、提取水平与垂直线的原理方法(通过开操作(膨胀和腐蚀)提取水平和垂直线);
2、实现步骤;
3、代码演示;

原理

1、关键:通过自定义的结构元素,使结构元素对输入图像的一些对象敏感,另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出,通过两个基本的形态学操作–膨胀和腐蚀,使用不同的结构元素实现对输入图像的操作,得到想要的结果;
2、膨胀–最大值滤波(区域最大像素值输出);
3、腐蚀–最小值滤波(区域最小像素值输出);
4、对于水平线,通过定义水平线的结构元素去除垂直线的干扰,对于垂直线,通过定义垂直线的结构元素去除干扰;

膨胀原理:取结构元素覆盖下的最大像素值;

腐蚀原理: 取结构元素下的最小像素值;

结构元素形状定义:支持自定义任何形状;

提取步骤

threshold:阈值
adaptivethreshold: 自适应阈值

相关API

adaptivethreshold():自适应阈值函数,将灰度图像转换为二值图像;
参考博文:

https://blog.csdn.net/sinat_36264666/article/details/77586964

参数含义如下:

demo:
adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
int adaptiveMethod : 自适应方法:一般选ADAPTIVE_THRESH_MEAN_C;
int thresholdtype : 阈值类型,二值图像:THRESH_BINARY;


Code

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
   
	Mat src = imread("C:\\Users\\hello\\Desktop\\12.jpg");
	Mat dst;
	if (!src.data)
	{
   
		cout << "could not load the image..." << endl;
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

	char OUTPUT_WIN[] = "result image";
	namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);

	//转换为灰度图像
	Mat gray_src;
	cvtColor(src, gray_src, CV_BGR2GRAY);
	imshow("gray image", gray_src);
	//转换为二值图像 自适应阈值进行转换 注意 : 灰度图像取反,设置背景为黑色,目标为白色
	Mat binImg;
	adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
	imshow("binary image", binImg);

	//设置膨胀腐蚀结构元素形状 -- 水平线和垂直线
	Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16,1));  //水平线
	Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16));  //垂直线
	
	//提取水平线: 开操作(先腐蚀后膨胀)
	//Mat temp;
	//erode(binImg, temp, hline);
	//dilate(temp, dst, hline);
	//bitwise_not(dst, dst); //颜色翻转与原图一致

	//提取垂直线, 开操作可以调用:morphologyEx()函数
	//Mat temp1;
	//erode(binImg, temp1, vline);
	//dilate(temp1, dst, vline);
	//bitwise_not(dst, dst);
	//morphologyEx(binImg, dst, CV_MOP_OPEN, vline);//膨胀操作API
	//bitwise_not(dst, dst);
	//提取完后滤波一下可以使图像更圆滑
	//blur(dst, dst, Size(3, 3), Point(-1, -1));
	//imshow(OUTPUT_WIN, dst);

	//定义一个 矩形结构元素 去干扰线
	Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7));
	morphologyEx(binImg, dst, CV_MOP_OPEN, kernel);
	bitwise_not(dst, dst);
	imshow(OUTPUT_WIN, dst);

	waitKey(0);
	return 0;
}

效果

水平线提取效果:(使用水平结构元素)

垂直线提取效果:(使用垂直结构元素,输出图像均值滤波了一下,更光滑,生成二值图像翻转了颜色)

提取字母:(使用矩形结构元素,滤除干扰线)

二值图像,灰度图像,彩色图像的区别

二值图像: 每个像素只用1bit表示,只有黑白两种色;

二值图像(Binary Image),按名字来理解只有两个值,0和1,0代表黑,1代表白,或者说0表示背景,而1表示前景。其保存也相对简单,每个像素只需要1Bit就可以完整存储信息。如果把每个像素看成随机变量,一共有N个像素,那么二值图有2的N次方种变化,而8位灰度图有255的N次方种变化,8为三通道RGB图像有255255255的N次方种变化。也就是说同样尺寸的图像,二值图保存的信息更少。二值图像(binary image),即图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示二值图像。

灰度图像:每个像素用一个通道(8位,16位…)表示,像素值从最暗到最白;

灰度图像是二值图像的进化版本,是彩色图像的退化版,也就是灰度图保存的信息没有彩色图像多,但比二值图像多,灰度图只包含一个通道的信息,而彩色图通常包含三个通道的信息,单一通道的理解可以理解为单一波长的电磁波,所以,红外遥感,X断层成像等单一通道电磁波产生的图像都为灰度图,而且在实际中灰度图易于采集和传输等性质的存在导致基于灰度图像开发的算法非常丰富。

灰度图像(gray image)是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;但是,灰度图像在黑色与白色之间还有许多级的颜色深度。灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的,用于显示的灰度图像通常用每个采样像素8位的非线性尺度来保存,这样可以有256级灰度(如果用16位,则有65536级)。

彩色图像:RGB图像,每个像素由3个通道进行表示;

彩色图像,每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)。

机器人视觉,,

全部评论

相关推荐

2025-12-08 07:42
门头沟学院 Java
27届末九,由于是女生,身边人几乎没有就业导向的,自学只能跟着网课,没人指导,很迷茫。下图是我目前的简历,不知道有需要修改的地方吗?求拷打。下面是目前的学习情况:目前算法过完了一遍力扣100和代码随想录,不过不是很熟,面经看了小林coding、JavaGuide,有一些没用过的技术看得不是很明白,掌握得不是很扎实。再加上常年跟黑马网课听思路,真正自己动手写代码的时间很少,这让我一直不敢投简历,总觉得内里空虚。项目没准备好面试相关的问题,简历上相应的考点不熟。如此种种。。。看到很多很多学长学姐大佬们的面经,愈发觉得面试可怕,自己没准备好,总担心自己是不是无望后端开发了。看到牛客很多同届以及更小一届的同学都找到实习了,很希望自己也能找到实习。而自己又好像摸不到后端学习的门路,只能不断赞叹黑马虎哥写的代码真优雅!微服务架构实在巧妙!消息队列、redis、sentinel、nacos、mybatisplus等等的引入都会让我赞叹这些工具的设计者的巧思,以及包括但不限于Java语言的优雅。然而只是停留在了解的程度,并不熟练。我是很希望能够继续深入探索这些知识的,只不过有一大部分时间都花在学校课程上了。我感觉我被困住了,我一方面必须保证我能够有个不错的学业分使我能有我几乎不想选择的读研退路(还有个原因是复习不全我会焦虑考试挂科,因此我会做好全面的准备,而这一步很费时间),一方面在B站学习各种网课,一方面得考虑提升自己并不扎实的算法基础,另一方面还得准备八股面经。这让我有点苦恼,我好像没那么多时间,因为绝大部分时间都花在了复习学校科目中了。我好像处处用时间,但收效甚微。想问问各位大佬是怎么平衡时间的呢?算法、项目和八股是怎么准备的呢?有什么高效的方法吗?谢谢您们花时间阅读我的稿件!
菜菜狗🐶:大胆投,我当时也是害怕面试,投多了发现根本约不到面🤡
投递哔哩哔哩等公司8个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务