2017-11-27 14:15:16 rosefun96 阅读数 165

1、形态学运算

1.1腐蚀:
matlab指令,

I=imerode(I,se);%se为结构元素。

MATLAB构造结构元素:
se=strel(shape,parameters)

1.2膨胀
I=imdilate(I,se)

1.3开运算
相当于,先腐蚀后膨胀处理;
使图像变得光滑,断开狭窄处连接和消除毛刺。

I=imopen(I,se);

1.4闭运算
相当于,先膨胀后腐蚀。
使图像光滑,弥合狭窄的间断。
I=imclose(I,se)

2、区域填充

在区域内,放一个种子(一个像素),通过十字架进行扩充,同时限制在区域内(和区域的补空间求交);不断重复这一步骤。

2019-03-25 13:05:24 weixin_41715077 阅读数 2038

1、概述:

WebSocket是一种在单个TCP连接上进行全双工通信的协议。在我们应用的过程仲,客户端会出现无故断开的情况。这里提供一种连接断开的异常检测机制。

2、异常信息:

系统中出现的异常
2019-03-12 18:56:24,044 ERROR [com.lenovo.SocketServer.ping(172)] -
2019-03-12 18:56:24,045 ERROR [com.lenovo.SocketServer.ping(173)] - <java.net.SocketException: Software caused connection abort: recv failed>

2.1、之前有人给出的方案:

总结产生原因,在服务端/客户端单方面关闭连接的情况下,另一方依然以为tcp连接仍然建立,试图读取对方的响应数据,导致出现Software caused connection abort: recv failed的异常。 通过inputstream的available()方法来判断,是否有响应结果。但是对SocketInputStream没有效果,因为SocketInputStream 在断开连接和数据正常传输状态的下 available 返回值都是0。

3、代码分析

其中InputStream 类型为 SocketInputStream,但是SocketInputStream 在 jdk 的rt.jar 中,是JDK的核心专用类型,不是public类型,只能通过反射获取其中的参数。 有一行代码:boolean eof = (Boolean) getValueByKey(inputStream, “eof”);获取eof 字段的值就是通过Java 的反射机制做的。下面会重点说这个字段。

开启WebSocket服务端:

    
	private static void generateTCPServer() throws IOException
	{
		ServerSocket serverSocket = new ServerSocket(12345);

		while (true)
		{
			Socket socket = serverSocket.accept();
			Thread thread = new Thread()
			{
				@Override
				public void run(){
					System.out.println("开启新的线程");					
					while (true){
						try {
							if (socket == null){
								System.out.println("socket为null");
								Thread.interrupted();
							}
							else{
								boolean flag = handler(socket);
								if(!flag)
								{
									System.out.println("Client Down");
									Thread.interrupted();
									break;
								}
							Thread.sleep(50);
							}
						}
						catch (Exception e)
						{
							logger.error("System error");
							logger.error(e.getMessage());
							e.printStackTrace();
						}
						
					}
				}
			};
			thread.start();
		}
	}

连接数据处理逻辑:


	public static boolean handler(Socket socket) {
		try {
			OutputStream outputStream = socket.getOutputStream();
			InputStream inputStream = socket.getInputStream();
			// 接受客户端的响应
			byte[] b = new byte[51200];
			inputStream.read(b);

			// 第一种方式:通过获取eof 参数获取当前连接是否断开的参数
			boolean eof = (Boolean) getValueByKey(inputStream, "eof");
			if (true == eof) {
				// 已经断开
				logger.error("");
				return false;
			}
			
			// 第二种方式:获取传输的内容
			String msg = CommonUtil.toHexString(b);
			String head = msg.substring(0, 2);
			// client断开
			if (head.equals("00")) {
				logger.error("");
				return false;
			}
			
		} catch (IOException e) {
			logger.error("IOException by TCP");
			logger.error(e);
		}
		return true;
	}

4、场景分析

4.1.建立Socket连接,底层就是TCP连接:

连接过程代码走到 inputStream.read(b);就I/O中断了 并等待请求数据过来,继续执行下面的代码。new byte[51200] 为下一次请求建立了一缓存区,用于接收下一次请求的数据。
在这里插入图片描述
这里Thread的状态仍然是RUNNABLE。
在这里插入图片描述
发起连接请求:响应 为空

在这里插入图片描述
流程处理过程中部分核心参数:

    OutputStream
		   append:false
		   channel:null
		   closed:false
		   closing:false
		   socket:
			  bound:true
			  created:true
			  connected:true
			  closed:false
		InputStream
			channel:null
			closed:false 
			closing:false
			eof:false  =========== 不一样的地方
			socket:
			  bound:true
			  created:true
			  connected:true
			  closed:false

4.2.发送数据

代码从连接检测的代码处继续执行,一直到返回响应结束。
// 第一种方式:通过获取eof 参数获取当前连接是否断开的参数
boolean eof = (Boolean) getValueByKey(inputStream, “eof”);
在这里插入图片描述
在这里插入图片描述

流程处理过程中部分核心参数:如果连接没有断开,就是上一次请求结束后的参数。

      OutputStream
		   append:false
		   channel:null
		   closed:false
		   closing:false
		   socket:
			  bound:true
			  created:true
			  connected:true
			  closed:false
		InputStream
			channel:null
			closed:false 
			closing:false
			eof:false  =========== 不一样的地方
			socket:
			  bound:true
			  created:true
			  connected:true
			  closed:false

4.3.断开连接

代码从连接检测的代码处继续执行,但是在连接断开检测的时候就结束了 并返回false。
// 第一种方式:通过获取eof 参数获取当前连接是否断开的参数
boolean eof = (Boolean) getValueByKey(inputStream, “eof”);
以下两种方式中的任意一种都可以作为连接断开检测代码,推荐第一种:
在这里插入图片描述
在这里插入图片描述

流程处理过程中部分核心参数:连接断开后eof为true.

       OutputStream
		   append:false
		   channel:null
		   closed:false
		   closing:false
		   socket:
			  bound:true
			  created:true
			  connected:true
			  closed:false
		InputStream
			channel:null
			closed:false 
			closing:false
			eof:true  ============不一样的地方
			socket:
			  bound:true
			  created:true
			  connected:true
			  closed:false

5、总结:

优先通过连接状态来判断客户端是否断开。需要建立一种异常检测机制和连接重连的机制。

2019-05-04 08:59:07 zaishuiyifangxym 阅读数 1170

目录

1 图像顶帽运算(原始图像 — 开运算)

1.1 基本原理

1.2 代码示例

2 图像黑帽运算(闭运算 — 原始图像)

2.1 基本原理

2.2 代码示例

参考资料


前面介绍了 形态学处理——图像开运算与图像闭运算,其中:

图像开运算先腐蚀,后膨胀。一般会平滑物体的轮廓、断开较窄的狭颈并消除细的突出物。

图像闭运算先膨胀,后腐蚀。同样也会平滑轮廓的一部分。但与开操作相反,它通常会弥合较窄的间断和细长的沟壑,消除小的孔洞,填补轮廓线中的断裂。

 

1 图像顶帽运算(原始图像 — 开运算)

1.1 基本原理

图像顶帽(或图像礼帽)运算是原始图像减去图像开运算的结果,得到图像的噪声。如下图所示:

顶帽运算:原始图像 — 图像开运算

 

 

1.2 代码示例

图像顶帽运算使用函数 morphologyEx() ,其参数 cv2.MORPH_TOPHAT 对应顶帽运算。

morphologyEx() 函数形式如下:

dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

其中,参数:

dst 表示处理的结果;

src 表示原图像;

cv2.MORPH_TOPHAT 表示顶帽运算;

kernel 表示卷积核。

例如,下图表示 5\times5 的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

 

(1)卷积核大小为 5\times

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np

#读取图片
src = cv2.imread('test5.bmp', cv2.IMREAD_UNCHANGED)

#设置卷积核
kernel = np.ones((5,5), np.uint8)

#图像闭运算
result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

运行结果如下图所示:

 

(2)卷积核大小为 15\times15 

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np

#读取图片
src = cv2.imread('test5.bmp', cv2.IMREAD_UNCHANGED)

#设置卷积核
kernel = np.ones((15,15), np.uint8)

#图像闭运算
result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

运行结果如下图所示:


 

2 图像黑帽运算(闭运算 — 原始图像)

2.1 基本原理

图像黑帽运算是图像闭运算操作减去原始图像的结果,得到图像内部的小孔,或者前景色中的小黑点。如下图所示:

黑帽运算:闭运算 — 原始图像

 

2.2 代码示例

图像黑帽运算使用函数 morphologyEx() ,其参数 cv2.MORPH_BLACKHAT 对应黑帽运算。

morphologyEx() 函数形式如下:

dst = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

其中,参数:

dst 表示处理的结果;

src 表示原图像;

cv2.MORPH_BLACKHAT 表示黑帽运算;

kernel 表示卷积核。

例如,下图表示 5\times5 的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

 

(1)卷积核大小为 5\times5

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np

#读取图片
src = cv2.imread('test6.bmp', cv2.IMREAD_UNCHANGED)

#设置卷积核
kernel = np.ones((5,5), np.uint8)

#图像闭运算
result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

运行结果如下图所示:

 

 

(2)卷积核大小为 15\times15

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np

#读取图片
src = cv2.imread('test6.bmp', cv2.IMREAD_UNCHANGED)

#设置卷积核
kernel = np.ones((15,15), np.uint8)

#图像闭运算
result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

运行结果如下图所示:

 


 

参考资料

[1] https://blog.csdn.net/Eastmount/article/details/83692456

[2] Python+OpenCV图像处理

2016-04-19 21:39:56 xingyuan1hao 阅读数 902

 

TCP是因特网中的传输层协议,使用三次握手协议建立连接,下面是TCP建立连接的全过程。

 

TCP断开连接的过程:TCP四次挥手。

 

TCP/IP 协议簇分层结构

数据链路层主要负责处理传输媒介等众多的物理接口细节;

网络层负责处理数据分组在网络中的活动,包括上层数据报文的分割、选路 等;

传输层则负责为两台主机提供端到端的通信;

应用层将负责处理应用程序的特定细节。

其中,IP 协议是网络层的核心协议,用来提供不可靠、无连接的数据传递服务;而 TCP 协议则处于传输层,其基于不可靠无连接的 IP 协议能够为两台主机提供面向连接的、可靠的通信。

 

 

探测 TCP 连接断连的三种常用方法

探测 TCP 连接是否断连或是工作正常的原理比较简单:定期向连接的远程通信节点发送一定格式的信息并等待远程通信节点的反馈,如果在规定时间内收到来自远程节点的正确的反馈信息,那么该连接就是正常的,否则该连接已经断连。依据该原理,目前常用的探测方法有以下三种。

应用程序的自我探测

应用程序本身附带探测其自身建立的 TCP 连接的功能。这种方法具有极大的灵活性,可以依据应用本身的特点选择相应的探测机制和功能实现。然而,实际应用中,大部分应用程序均没有附带自我探测的功能。

第三方应用程序的探测

此种方法就是在服务节点上安装相应的第三方应用程序来探测该节点上所有的 TCP 连接是否正常或是已经断连。该方法最大的不足就是需要所有支持探测的客户端能够识别来自该探测应用的数据报文,因此,实际应用中比较少见。

TCP 协议层的保活探测

最常用的探测方法就是采用 TCP 协议层提供的保活探测功能即 TCP 连接保活定时器。尽管该功能并不是 RFC 规范的一部分,但是几乎所有的类 Unix 系统均实现了该功能,所以使得该探测方法被广泛使用。

 

转载:http://www.ibm.com/developerworks/cn/aix/library/0808_zhengyong_tcp/ TCP 连接断连问题剖析

http://blog.csdn.net/hguisu/article/details/38700899  TCP连接的状态详解以及故障排查

http://blog.csdn.net/kkkkkxiaofei/article/details/12966407 Tcp通信中服务器处理客户端意外断开

 

 

2019-07-04 14:18:18 weixin_39504171 阅读数 27

图像处理7:一些形态学处理

(1)开运算、闭运算:

       ①开运算:

            先腐蚀后膨胀的过程称为开运算,用来消除小物体、在纤细处分离物体、平滑较大物体的边界的同时并不明显改变其面积。开操作一般使对象的轮廓变得圆滑,断开狭窄的间断和消除细小的突出物。

       ②闭操作:

            先膨胀后腐蚀的过程称为闭运算,用来填充物体内的细小空间、连接相邻物体、平滑其边界的同时并不明显改变其面积。闭操作也用来使轮廓圆滑,它通常消除狭窄的间断和长细的鸿沟,消除小的空洞,并填充轮廓线中的断裂。

 

 (2)顶帽变换和底帽变换:

        ①顶帽变换、底帽变换简介:

             顶帽变换和底帽变换是数学形态学中重要的运算形式。

        ②顶帽变换、底帽变换原理:

             顶帽变换是通过利用原始图像与原始图像开操作的结果图像进行图像减操作实现的;

             底帽变换是通过原始图像闭操作的结果图像与原始图像进行图像减操作实现的。

         ③顶帽变换、底帽变换处理效果:

               1)顶帽变换:

                    顶帽变换具有高通滤波的特性,适用于处理具有暗背景、亮物体特征的图像。

                    顶帽变化的一个重要用途是用来消除不均匀光照的,比如一副图像里面有多个物体,用比这些物体都大的结构元,做一次顶帽变换,那么光照就变得相对均匀,首先比这些物体都大,那么这些物体就会被开操作删除掉,然后就剩下了不均匀的背景,然后用原图像减去这些不均匀的背景后这些物体就可以比较合适的处理。

               2)底帽变换:

                    底帽变换能够检测图像中的谷值,适用于处理具有亮背景、暗物体特征的图像。

          ④顶帽变换、底帽变换的halcon实现:

                    read disc se:加载结构化元素 ;

                    gen disc seo:生成一个椭圆结构;

                    gray_bothato 底帽变化;

                    gray tophato顶帽变化。

 

没有更多推荐了,返回首页