发动态
综合 最新发布 最新回复
图文
列表
置顶
HDI高密度互连板正式上线
图片的膨胀与腐蚀是非常常见的图像处理技巧(现在就见到了)需要注意的是,这里的腐蚀和膨胀时对于白色部分而言的,而不是黑色部分!!字体的大小就是常见的图像的腐蚀和膨胀。腐蚀和膨胀可以很好的去除掉图像中的噪声点,消除物体边界附近的像素。代码编写首先是导入相关的库import cv2 import numpy as np import matplotlib.pyplot as plt 之后利用opencv的函数来读取我们的图像。# 读取图像 img = cv2.imread('C:/Users/13256/Desktop/11.tif', cv2.IMREAD_GRAYSCALE) 定义结构元素来确定我们的卷积运算大小# 定义结构元素(核) kernel = np.ones((5, 5), np.uint8) 利用opencv的内置函数来进行膨胀运算# 膨胀操作 dilated_img = cv2.dilate(img, kernel, iterations=1) 最后显示出我们的图像# 显示原始图像、膨胀后的图像 plt.subplot(1, 2, 1), plt.imshow(img, cmap='gray'), plt.title('原始图像') plt.subplot(1, 2, 2), plt.imshow(dilated_img, cmap='gray'), plt.title('膨胀操作后的图像') plt.show()可以看到膨胀操作更凸显出图片的轮廓和边界将膨胀函数方法换成腐蚀,之后再运行我们的代码。# 腐蚀操作 dilated_img = cv2.erode(img, kernel, iterations=1) 以下附上全部代码import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图像 img = cv2.imread('C:/Users/13256/Desktop/11.tif', cv2.IMREAD_GRAYSCALE) # 定义结构元素(核) kernel = np.ones((5, 5), np.uint8) # 膨胀操作 dilated_img = cv2.erode(img, kernel, iterations=1) # 显示原始图像、膨胀后的图像 plt.subplot(1, 2, 1), plt.imshow(img, cmap='gray'), plt.title('原始图像') plt.subplot(1, 2, 2), plt.imshow(dilated_img, cmap='gray'), plt.title('膨胀操作后的图像') plt.show()
基于Python和opencv图像处理(3)——图片的膨胀与腐蚀
嘉立创PCB
前几期公众号(上一期)中有介绍如何使用ESP32_Cam获取图像利用TCP协议上传,之后利用利用Python解析收到的代码并且显示出来。那么本期我们在之前的C#软件大合集中添加TCP服务器端并完成在C#中的图像显示的功能。在上一期说过,由于HTTP协议需要等待响应,因此可以做到非常好的数据传输校验。而TCP协议不需要服务器响应,因此虽然在数据传输的可靠性上得到了下降,但是在数据传输的速度上却得到了质的飞跃。首先简简单单地做个界面,右边是选择地址和端口的界面,左边是分开文本接收模式和图片显示模式。有一个件方便我们选择IP地址,由端口号来选择我们的端口号,需要注意的是通常端口都是开放的,如果我们遇到了打开端口报错的问题,我们需要及时调节我们的端口或者开启管理员模式。虽然说是1024及以下的低序列端口才需要开启管理员模式才能打开,但是在实际的使用中发现如果需要使用端口还是需要打开管理员模式的。IPV6地址由四组组成,我们获得的地址包括我们的公网地址以及映射地址。值得一提的事,如果设置地址是即默认监听所有可用地址。private void LoadLocalIPv4Addresses() { try { // 获取本地主机名 string hostName = Dns.GetHostName(); // 获取主机名对应的IP地址列表 IPAddress[] ipAddresses = Dns.GetHostAddresses(hostName); // 筛选IPv4地址并添加到 foreach (IPAddress ipAddress in ipAddresses.Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)) { IPAddressChoose.Items.Add(ipAddress.ToString()); } // 设置默认选择第一个IPv4地址 if (IPAddressChoose.Items.Count > 0) { IPAddressChoose.SelectedIndex = 0; } } catch (Exception ex) { MessageB.Show($"错误:{ex.Message}", "错误", MessageBButtons.OK, MessageBIcon.Error); } } 首先是加载的时候筛选出本机可以用的IP地址,把IP地址加入我们的控件中,方便我们使用时候的选择。主要代码之后编写创建监听的代码。创建监听的步骤主要是建立一个TCP监听句柄,之后使用异步的方法创建一个回调函数来处理我们接收到的图像。需要调节关闭时候的任务状态,防止调用过程中关闭监听,导致监听继续从而发生代码中断。 private void Connect_Click(object sender, EventArgs e) {        if (Connect.Text == "创建监听")        {             DisableAll();             StartListening();             Connect.Text = "结束监听";        }        else        {            EnableAll();            StopListening();            Connect.Text = "创建监听";        } } 创建监听的按钮按下后首先是禁用其他控件,之后是创建监听。private void StartListening() { try { // 获取选定的IP地址和端口 IPAddress ipAddress = IPAddress.Parse(IPAddressChoose.SelectedItem.ToString()); int port = int.Parse(PortChoose.Text); // 启动TCP监听 tcpListener = new TcpListener(ipAddress, port); tcpListener.Start(); cancellationTokenSource = new CancellationTokenSource(); isListening = true;                 //开辟线程实现异步监听 listenerThread = new Thread(() => ListenForImages(cancellationTokenSource.Token)); listenerThread.Start(); } catch (Exception ex) { MessageB.Show($"错误:{ex.Message}", "错误", MessageBButtons.OK, MessageBIcon.Error); } } private void StopListening() { // 停止TCP监听 isListening = false; if (cancellationTokenSource != null) {                 cancellationTokenSource.Cancel();//取消进程防止出错 cancellationTokenSource.Dispose(); cancellationTokenSource = null; } if (tcpListener != null) { tcpListener.Stop(); } } 创建监听的时候,我们根据所选择的IP地址和端口开启TCP监听,并且使用一个isListening标志位来判断是否处于监听状态。需要注意的是这里的cancellationTokenSource.Dispose()是不可少的,如果缺少这行代码就会导致异步程序进行会导致程序错误。 并且开始一个线程来实现异步监听。 之后分别是异步监听的函数,将我们收到的TCP数据转化为图片信息进行保存,并且把图片显示到PictureBox控件上。需要注意的是,在异步监听的函数中,我们使用Console.WriteLine来打印错误信息,防止阻塞UI进程。 效果展示
基于C#的软件大杂烩(4.1)—— 和ESP32_cam搭配的TCP协议解析图像
嘉立创PCB
1-32层pcb打样,真A级板材,最快12小时出货,自营制造,品质可靠!
打赏记录
服务时间:周一至周六 9::00-18:00 · 联系地址:中国·深圳(福田区商报路奥林匹克大厦27楼) · 媒体沟通:pr@jlc.com · 集团介绍
移动社区