# -*- 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. 利用.frm、.ibd恢复数据

    我们知道启用innodb_file_per_table选项后,单个表(InnoDB引擎)的数据和索引放入单独的文件中(.ibd),建表语句保存在.frm文件中本文假设192.168.85.132,33 ...

  2. php 利用root 权限执行shell脚本

    http://blog.csdn.net/lxwxiao/article/details/8513355 也可以指定某个shell文件不需要密码 www-data ALL=(ALL) NOPASSWD ...

  3. split('\r\n')

    '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格.通常用的Enter是两个加起来. 实际我的脚本读取FTP的列表,如果用的split("\r\n"),可以获得正 ...

  4. Win10安装TensorFlow1.9-GPU版本

    前言 前段时间更新自己电脑上的tf1.4到1.9,没想到踩了这么多坑...特意记录下来希望可以帮到大家 删除旧版本 如果你电脑上没有安装旧版本的tf,就可以忽略这一步.我是因为想要升级到最新版本,所以 ...

  5. Windows10 + Visual Studio 2017 + CMake +OpenCV编译、开发环境配置及测试

    由于最近需要使用OpenCV,本人需要在自己的PC上使用OpenCV,因此最近一直在研究如何使用Visual Studio编译OpenCV源代码并搭建开发环境,折腾了很长时间,查阅了很多相关资料,终于 ...

  6. jenkins cobertura单元测试

    1.1      Maven 工程 pom.xml 修改 1.2      Build添加插件目标 此时构建项目,会在项目 targer/site/cobertura 目录中生成 html 与 xml ...

  7. js 、c# 编码解码

    escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@ ...

  8. jquery学习集合

    跳转网页:$(location).attr('href', '/index');

  9. 作业8_exer1128.txt

    1.规范化理论是关系数据库进行逻辑设计的理论依据,根据这个理论,关系数据库中的关系必须满足:每 一个属性都是(B). A.长度不变的 B.不可分解的 C.互相关联的 D.互不相关的 2.已知关系模式R ...

  10. Oracle 网络配置与管理

    [学习目标] Oracle 监听器是一个服务器端程序,用于监听所有来自客户端的请求,并为其提供数 据库服务.因此对监听器的管理与维护相当重要.         本章主要内容是描述对Oracle 监听器 ...