# -*- coding: utf-8 -*-
"""
Created on Wed Mar 7 11:04:15 2018 @author: markli
"""
import numpy as np;
from PIL import Image;
import matplotlib.pyplot as pyplot;
class ImageFilter:
def __init__(self,filepath):
self.path = filepath; def Filter(self,filtermatrix):
"""步长设定为1"""
img = Image.open(self.path);
#img = img.resize((32,32));
r,g,b = img.split(); #rgb 通道分离
#转为数字矩阵
r_arr = np.array(r);
g_arr = np.array(g);
b_arr = np.array(b); matrix = [r_arr,g_arr,b_arr];
#过滤后的结果矩阵
fm = np.ones((r_arr.shape[0] - filtermatrix.shape[0] + 1,r_arr.shape[1] - filtermatrix.shape[1]+1));
fm_rgb = [];
#卷积运算 实现过滤
for m in matrix:
row = 0;
for i in range(fm.shape[0]):
col = 0;
for j in range(fm.shape[1]):
temp = m[row:row + filtermatrix.shape[0],col:col + filtermatrix.shape[1]];
fm[i][j] = np.sum(np.multiply(temp,filtermatrix));
col = col + 1;
row = row + 1; fm_rgb.append(fm); return fm_rgb;
# #数字矩阵转为RGB通道像素
# r = Image.fromarray(fm_rgb[0]).convert('L');
# g = Image.fromarray(fm_rgb[1]).convert('L');
# b = Image.fromarray(fm_rgb[2]).convert('L');
# image = Image.merge("RGB", (r, g, b));
# #图片显示
# pyplot.imshow(image);
# pyplot.show();
def MergeEdage(self,savepath):
leftmatrix = np.array([[1,0,-1],[1,0,-1],[1,0,-1]]);#左边界
left = self.Filter(leftmatrix);
rightmatrix = np.array([[-1,0,1],[-1,0,1],[-1,0,1]]);#右边界
right = self.Filter(rightmatrix);
w_1,h_1 = left[0].shape; #left 和 right 维数相同,使用哪个都可以
full_edage = [];
for i in range(3):
m = np.hstack((left[i][:,:int(w_1/2)],right[i][:,w_1-int(w_1/2):]));
full_edage.append(m); #数字矩阵转为RGB通道像素
r = Image.fromarray(full_edage[0]).convert('L');
g = Image.fromarray(full_edage[1]).convert('L');
b = Image.fromarray(full_edage[2]).convert('L');
image = Image.merge("RGB", (r, g, b));
#图片显示
pyplot.imshow(image);
pyplot.show();
image.save(savepath); img = ImageFilter("C:\\Users\\yangp\\Desktop\\612474963277897033.jpg");
img.MergeEdage("C:\\Users\\yangp\\Desktop\\fulledage.jpg");

下面给出原图、左边界和右边界识别情况:

最后是将左右边界合并,形成整体:

最后说明一下,其中的过滤矩阵可以扩大,将过滤矩阵值的变化放慢,可以使图像的识别更加细致,在这里本人的电脑配置太低,就不演示了。当然图片的轮廓可以使用Image库中的filter方法显现出来,语法是img = Image.open("C:\\Users\\yangp\\Desktop\\612474963277897033.jpg");img.filter(ImageFilter.FIND_EDGES);img.show();

Python3 图像边界识别的更多相关文章

  1. [免费下载应用]iNeuKernel.Ocr 图像数据识别与采集原理和产品化应用

    目       录 1..... 应用概述... 2 2..... 免费下载试用... 2 3..... 视频介绍... 2 4..... iNeuLink.Ocr图像数据采集应用... 2 5... ...

  2. [OpenCV]拓展图像边界

    图像处理中经常遇到使用当前像素邻的像素来计算当前像素位置的某些属性值,这样就会导致边界像素处越界访问,一般有两种方法解决这种问题:只对不越界的像素进行处理:对图像边界进行拓展,本文主要介绍如何使用Op ...

  3. Java基于opencv实现图像数字识别(五)—投影法分割字符

    Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...

  4. Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

  5. Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

  6. Java基于opencv实现图像数字识别(二)—基本流程

    Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要 ...

  7. Java基于opencv实现图像数字识别(一)

    Java基于opencv实现图像数字识别(一) 最近分到了一个任务,要做数字识别,我分配到的任务是把数字一个个的分开:当时一脸懵逼,直接百度java如何分割图片中的数字,然后就百度到了用Buffere ...

  8. 【python-opencv】18-图像梯度+图像边界

    效果图: *一阶导数与Soble算子 *二阶导数与拉普拉斯算子 定义:把图片想象成连续函数,因为边缘部分的像素值是与旁边像素明显有区别的,所以对图片局部求极值,就可以得到整幅图片的边缘信息了. 不过图 ...

  9. opencv —— copyMakeBorder 扩充图像边界

    扩充图像边界:copyMakeBorder 函数 在图像处理过程中,因为卷积算子有一定大小,所以就会导致图像一定范围的边界不能被处理,这时就需要将边界进行适当扩充. void copyMakeBord ...

随机推荐

  1. vue单页应用中 返回列表记住上次滚动位置、keep-alive缓存之后更新列表数据 那点事

    实践场景需求 产品列表中,滚动到一定位置的时候,点击查看产品信息,后退之后,需要回到原先的滚动位置,这是常见的需求 所有页面均在router-view中,暂时使用了keep-alive来缓存所有页面, ...

  2. Git操作学习笔记

    根据廖雪峰老师git教程学习整理 这里需要辨析一下概念.Github是代码托管平台,是协作的工具;而Git是版本控制工具.Git不需要联网,在本机就可以使用 集中式版本控制系统与分布式版本控制系统 S ...

  3. Go 语言读书笔记

    Go语言的设计理念很明确,就是将动态类型语言的编程容易度和静态类型语言的安全效率结合起来.     Go语言,又称Golang,是Google开发的一款静态强类型.编译型.并发型,并具有垃圾回收机制的 ...

  4. 2018-2019-2 网络对抗技术 20165320 Exp3 免杀原理与实践

    ### 2018-2019-2 网络对抗技术 20165320 Exp3 免杀原理与实践 一.实验内容 1.1 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分) ...

  5. 带事件的Bootstrap模态框的使用2

    模态框中显示一些基本的数据以及触发一些基本的JS函数 <%@ page language="java" contentType="text/html; charse ...

  6. SpringMVC的JSON数据交互(七)-@Response,@RestController,@RequestBody用法

    1.@RequestBody   (自动将请求的数据封装为对象) 作用: @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConve ...

  7. k64 datasheet学习笔记3---Chip Configuration之Clock modules

    1.前言 本文主要讲述chip configure之clock配置相关的内容,主要包含如下三个部分: MCG configuration:Multipurpose clock generator OS ...

  8. oracle查看表名称和表字段注释

    --查询该表字段的注释select * from user_col_comments where Table_Name like '%SMS%' --查询类似表select * from user_t ...

  9. MVC自定义视图引擎地址

    先看结构 1.RouteConfig 文件(注意顺序) public static void RegisterRoutes(RouteCollection routes) { routes.Ignor ...

  10. saltstack中如何实现多个master来管理minion

    背景: 公司有多个部门,有一些机器有本部门的业务,这些机器也有其他部门的业务,所以本部门需要一个master服务器来管理这批机器,其他部门也需要一个master服务器来管理这个机器,所以就需要多个ma ...