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)。

机器人视觉,,

全部评论

相关推荐

像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
最近又搬回宿舍了,在工位坐不住,写一写秋招起伏不断的心态变化,也算对自己心态的一些思考表演式学习从开始为实习准备的时候就特别焦虑,楼主一开始选择的是cpp后端,但是24届这个方向已经炸了,同时自己又因为本科非92且非科班,所以感到机会更加迷茫。在某天晚上用java写出hello&nbsp;world并失眠一整晚后选择老本行干嵌入式。理想是美好的,现实情况是每天忙但又没有实质性进展,总是在配环境,调工具,顺带还要推科研。而这时候才发现自己一直在表演式学习,徘徊在设想如何展开工作的循环里,导致没有实质性进展。现在看来当时如果把精力专注在动手写而不是两只手端着看教程,基本功或许不会那么差。实习的焦虑5月,楼主...
耶比:哲学上有一个问题,玛丽的房间:玛丽知道眼睛识别色彩的原理知道各种颜色,但是她生活在黑白的房间里,直到有一天玛丽的房门打开了她亲眼看到了颜色,才知道什么是色彩。我现在最大可能的减少对非工作事情的思考,如果有一件事困扰了我, 能解决的我就直接做(去哪里或者和谁吵架等等……),解决不了的我就不想了,每一天都是最年轻的一天,珍惜今天吧
投递比亚迪等公司10个岗位 > 秋招被确诊为…… 牛客创作赏金赛
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务