用numpy.pad()对图像进行填充及简单的图像处理

三、用numpy.pad()对图像进行填充及简单的图像处理

https://blog.csdn.net/wang454592297/article/details/80854996

一、用numpy.pad()对图像进行填

我们都知道在css的盒子模型中,有padding(内边距)这一属性。同css中的padding类似,在numpy中,numpy.pad()可以跟矩阵添加内边距,这一方法在CNN中的卷积层可以用到,可以影响到卷积后矩阵的维度,其用法如下:

numpy.pad(array, pad_width, mode, **kwargs)[source]

其中array是需要添加内边距的矩阵。pad_width对应矩阵每个维度填充的宽度,其格式是这样的:((before 1 ,after 1 ),…(before N ,after N )) ((before1,after1),…(beforeN,afterN)) ,(before N ,after N ) (beforeN,afterN) 表示第n维之前和时候填充的宽度。mode表示填充矩阵的值的模式,对应有:”constant“——表示用一个常量填充矩阵,“minimum”——用某个维度上的最小值填充矩阵,等其他模式。具体可参照官方APInumpy.pad。下面看一个用numpy.pad填充图像的例子,代码如下:

import pylab
import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt

dir = "./testImgs/"
filename = dir + "la_defense.jpg"
ori_image = np.array(ndimage.imread(filename, flatten=False))
dim1_pad = np.pad(ori_image, ((50, 50), (0, 0), (0, 0)), ‘constant‘, constant_values=0)
dim2_pad = np.pad(ori_image, ((0, 0), (50, 50), (0, 0)), ‘maximum‘)
dim3_pad = np.pad(ori_image, ((50, 50), (50, 50), (0, 0)), ‘constant‘, constant_values=200)
print("origin shape:" + str(ori_image.shape))
print("vertical pad:" + str(dim1_pad.shape))
print("horizontal pad:" + str(dim2_pad.shape))
print("all pad:" + str(dim3_pad.shape))

fig, axarr = plt.subplots(2, 2)
axarr[0, 0].imshow(ori_image)
axarr[0, 1].imshow(dim1_pad[:, :, 0])
axarr[1, 0].imshow(dim2_pad[:, :, 1])
axarr[1, 1].imshow(dim3_pad[:, :, 2])
pylab.show()

  

显示的结果如下:

以上代码中用到了scipy.ndimage.imread读取图片,可以结合我的另一篇博客二、使用scipy读图片并改变图片大小进行理解。读到的图片是一个(1181,1181,3)的3维矩阵,第三维表示RGB三个通道。我分别在R、B、G三个通道上进行了填充,第二张图是在R通道的第一维(上下)分别填充50的像素的宽度,第三张图是在G通道的第二维(左右)分别填充50的像素的宽度(模式为minimum),第四张图是在B通道的第一、二维分别分别填充50的像素的宽度。可以看出,这四张图都是不一样的(尽管第三、四张图差别不大),填充后矩阵的维度如下:

二、简单的图像处理

在利用CNN进行图片分类的时候,有时候会缺少样本,我们可以通过用已有的样本来自己创建新的样本,如图像的旋转,裁剪,图像颜色的改变等。下面是通过改变图像的颜色来创建新的图片,代码如下:

import pylab
import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt

def new_pic_arr(dim0, dim1, dim2, dim0_plus, dim1_plus,dim2_plus):
    pic = np.zeros((1181, 1181, 3), dtype=np.uint8)
    pic[:, :, 0] = dim0 + dim0_plus
    pic[:, :, 1] = dim1 + dim1_plus
    pic[:, :, 2] = dim2 + dim2_plus
    return pic

dir = "./testImgs/"
filename = dir + "la_defense.jpg"
ori_image = np.array(ndimage.imread(filename, flatten=False))
dim0 = ori_image[:, :, 0]
dim1 = ori_image[:, :, 1]
dim2 = ori_image[:, :, 2]

pic1 = new_pic_arr(dim0, dim1, dim2, 30, 0, 30)
pic2 = new_pic_arr(dim0, dim1, dim2, 40, 40, 0)
pic3 = new_pic_arr(dim0, dim1, dim2, 0, 40, 40)

fig, axarr = plt.subplots(2, 2)
axarr[0, 0].imshow(ori_image)
axarr[0, 1].imshow(pic1)
axarr[1, 0].imshow(pic2)
axarr[1, 1].imshow(pic3)
pylab.show()

  

最后的结果如下:

上述中的四副图中,图一是原始的图,图二是在原图的R、B通道上每个像素的值增加30后的结果,图三是在原图的R、G通道上每个像素的值增加40后的结果,图四是在原图的G、B通道上每个像素的值增加40后的结果。可以看出每张图的颜色都不同,我们可以利用这些新的样本来训练神经网路了。

原文地址:https://www.cnblogs.com/accumulationbystep/p/10419046.html

时间: 2024-11-09 03:22:11

用numpy.pad()对图像进行填充及简单的图像处理的相关文章

Android ImageButton图像完全填充缩放到控件

如果你发现你写程序的时候像我一样,发现图片怎么都无法拉伸填充到ImageButton 里面.而且就算能缩放到控件,但是图像较小,而且总会在 ImageButton周围有一圈边框!当你遇到这一些列问题的这时候你就可以收藏并吸收这个经验了. 总的过程:我先给出关键代码→ 分析给出的两种解决方案→ 我详细介绍一下边框出现的原因个解决办法.→ 最后就是些注意事项了 工具/原料 遇到问题尽可能冷静下来的心情. 记住收藏好我这条经验. ImageButton的长宽最好是固定的.注意事项里面我会告诉你为什么

python numpy初始化一个图像矩阵

mask_all = np.zeros((256, 256), dtype='uint8')  单通道 mask_all_enlarge = np.zeros((256, 256, 3), dtype='uint8'  三通道 #为三通道图像赋值,这里我用的是循环,因该还有更简单的方式 img_base = np.zeros((256, 256, 3), np.uint8)     for i in range(256):        for j in range(256):         

numpy.pad

np.pad()常用与深度学习中的数据预处理,可以将numpy数组按指定的方法填充成指定的形状. np.pad() 对一维数组的填充 import numpy as np arr1D = np.array([1, 1, 2, 2, 3, 4]) '''不同的填充方法''' print 'constant: ' + str(np.pad(arr1D, (2, 3), 'constant')) print 'edge: ' + str(np.pad(arr1D, (2, 3), 'edge')) p

matplotlib 画封闭图像并填充

1.画矩形 这个费了我半天劲,不知怎么就可以了. 复制来自:https://www.cnblogs.com/ymjyqsx/p/7390288.html import  matplotlib.pyplot  as plt fig = plt.figure()ax = fig.add_subplot(111)   #创建子图,为什么要这样创建,不明白 rect = plt.Rectangle((0.1,0.2),0.4,0.3, color="red")    # (0.1,0.2)为左

python + opnencv实现图像孔洞填充

import cv2import numpy as np path = "_holefill.jpg"img = cv2.imread(path)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转换成灰度图ret, thresh = cv2.threshold(gray, 50, 250, cv2.THRESH_BINARY_INV)#灰度图转换成二值图像thresh_not = cv2.bitwise_not(thresh)#二值图像的补集

Jupyter如何将numpy数据以图像形式展现?

示例如下: %matplotlib inline import matplotlib import matplotlib.ptplot as plt img = np.random.random((128,128,3)) plt.imshow(img, aspect='auto') plt.show() 注意通道数需要在最后一个维度. MARSGGBO?原创 2019-1-18 原文地址:https://www.cnblogs.com/marsggbo/p/10289616.html

学习笔记-php图像加水印组合图像简单完美剪裁-2016.4.7

<?php/** * Created by PhpStorm. * User: 兰小宇 * Date: 2016/3/30 * Time: 23:08 *///图像处理类class Image{ private $file; //图像地址 private $width; //获取图像的宽度 private $height; //获取图像的高度 private $type; //获取图像的类型 private $img; //原来图像的资源句柄 private $new; //新的资源句柄 //构

numpy meshgrid 和 mgrid 的两个简单实例和解析

numpy.meshgrid 和 numpy.mgrid 用于返回包含坐标向量的坐标矩阵. 当坐标矩阵为二维时, 可用于在图像变形时构建网格. 实例一 from __future__ import print_function import numpy as np grid_y1, grid_x1 = np.meshgrid(range(5), range(3)) grid_x2, grid_y2 = np.mgrid[0:3, 0:5] # Two arrays are element-wis

对图像进行读入和简单的处理

这次我们主要学习使用opencv的图片读取. Opencv 提供了imread 函数能够很快的读取图片,你可以用Mat类型的对象进行接收,imread函数的原型是: 1 Mat imread(const string& filename, int flags); 第一个参数是文件名称第二个是读取的方式,Imread函数使用是: 1 Mat img = imread(filename); 如果你读入一个jpg文件,缺省情况下将创建一个3通道图像.如果你需要灰度(单通道)图像,使用如下语句: Mat