2017-05-29 12:50:45 ling_xiobai 阅读数 23773
  • 深度学习图像处理之垃圾分类

    图像分类是图像处理领域的基本任务,同时也是深度学习领域的“Hello Word”,掌握好相关的基础知识,才能更好地开展识别、分割、去噪等更加复杂的任务。本课程将以当下最火热的垃圾分类作为主题,手把手地带领大家实现图像分类任务的完整过程。课程可以分为三个板块: (1)深度学习在图像处理领域的发展过程; (2)解析经典的卷积神经网络; (3)垃圾分类实战。本课程将使用Pytorch深度学习框架进行实战,并在ubuntu系统上进行演示,包括:不同标注文件下的数据集读取、编写卷积神经网络、训练垃圾分类数据集、测试训练网络模型、网络可视化、性能评估等。

    581 人正在学习 去看看 郭冰洋

说到图像处理,第一步就是图像读取。Matlab最简单的就是imread函数,本节介绍imread的用法以及容易出错的地方
读取图片
正如上图所示,在Matlab文档中,imread包括以上几种用法,但并不要求都要掌握,个人觉得会用一两种,其他了解语法即可。
我们来介绍下最最常用的语句A = imread(filename)
我们来读取一张图片

>> a = imread('凝视.jpg');
>> imtool(a)

duqu
如图所示,首先注意的是语法正确A = imread(‘凝视.jpg’);
一.正确示范。
他的意思是在当前路径里把文件名为“凝视.jpg”的图片数据读取到A中保存,那我们可以看到在图片最右边Workspace区域放着一些数据,这就是A的数据,我们看到这张图片是340*593*3大小,意思是340行,593列,3通道(RGB)的图片,右边的UINT8表示8位无符号的整型类型。(后面的imtool语句用于显示图片,这个将在后续细谈)
补充一点小知识:
想要清空Command Window,输入命令clc
想要清空Workspace,输入命令clear
想要关闭所有打开的窗口,输入命令close all
想要观看图像信息,用whos

二.踩坑
好了,既然我们知道正确的写法,那我们来试试有什么坑。(敢于试错是干这行的一个优秀品质)
1.为什么要分号?
因为matlab是按行编译,一行一行编译,不写分好,就会直接出来编译结果,给你们看个例子就明白。
juzhen
上面创建一个a和b矩阵,a矩阵不用分号结尾,窗口直接显示内容,而b矩阵用了分号,并不显示内容,但是可以看到编译后,在workspace已经创建两个数组矩阵,我们也可以看到,点击变量名可以看到最上面有具体的数据。同理,如果我们读取图片a = imread(‘凝望.jpg’)不写分号,那么窗口就会出现一大波数据,刷刷刷地跳出来,那酸爽,那些数据就是保存在数组里面的像素了。
小知识:
如果你不写变量名,比如>>imread(‘凝望.jpg’);它很默认地给你个名字叫:ans
当你想重新写一句语句和上面相同或相似的话,可以按键盘的上箭头按钮
箭头
这个快捷方式可以帮助你快速地修改语句,好用。

2.英文半角符号
这个学过编程的都应该知道吧,别整个中文“。”,也千万别用英文的全角符号“.”,至于为什么,我不知道。Matlab会出现:File “凝视.jpg” does not exist.

3.路径
这个是常会犯的,你记得你有那图片,也记得图片名称,但是你没有把他放在当前的路径里你叫人家怎么找,Matlab还没有那么强大到可以全搜索你电脑里面的图片文件。同样编译会出现 : does not exist。但是还有补救的方法,你可以给它指明可以去哪里找,例如:
zairu
我把图片‘凝视.jpg’放在D盘的build文件下面,结果不断地出错出错如图所示,乍一看,才发现把凝视写成凝望了,再一看,把build写成bulid,哈哈,我也只是个初学者,稍粗心就犯错,借此也说明写代码确实得聚精会神啊,这点BUG还容易改,但是如果你做的是大项目,写成百上千行代码,因为拼写错误而花了几个小时那实在是亏大了。

好了,本次文件读写就写到这里,有什么疑问可以评论大家一起讨论学习,也许我们会有思想的火花。可能说的都是很琐碎很简单的东西,只要能给你一点点收获,这篇博客就有价值了。下节继续介绍其他函数。感谢观看

2017-04-25 13:56:39 guduruyu 阅读数 21834
  • 深度学习图像处理之垃圾分类

    图像分类是图像处理领域的基本任务,同时也是深度学习领域的“Hello Word”,掌握好相关的基础知识,才能更好地开展识别、分割、去噪等更加复杂的任务。本课程将以当下最火热的垃圾分类作为主题,手把手地带领大家实现图像分类任务的完整过程。课程可以分为三个板块: (1)深度学习在图像处理领域的发展过程; (2)解析经典的卷积神经网络; (3)垃圾分类实战。本课程将使用Pytorch深度学习框架进行实战,并在ubuntu系统上进行演示,包括:不同标注文件下的数据集读取、编写卷积神经网络、训练垃圾分类数据集、测试训练网络模型、网络可视化、性能评估等。

    581 人正在学习 去看看 郭冰洋

python作为机器学习和图像处理的利器,收到越来越多的推崇,特别是在图像处理领域,越来越多的研究和开发开始转向使用python语言,下面就介绍python图像处理中最基本的操作,即图像的读取显示与保存。

1、使用PIL模块

代码如下:

from PIL import Image
import numpy as np


def test_pil():

    #读取图像
    im = Image.open("lena.jpg")
    #显示图像
    im.show()

    #转换成灰度图像
    im_gray = im.convert("L")
    im_gray.show()

    #保存图像
    im_gray.save("image_gray.jpg")

    return


显示结果如下:



2、使用scipy和matplotlib模块

代码如下:

import numpy as np
from scipy import misc
import matplotlib.pyplot as plt


def test_misc():
    #读取图像
    im = misc.imread("lena.jpg")
    #显示图像
    plt.figure(0)
    plt.imshow(im)

    #旋转图像
    im_rotate = misc.imrotate(im, 90)
    plt.figure(1)
    plt.imshow(im_rotate)

    #保存图像
    misc.imsave("lena_rotate.jpg", im_rotate)

    plt.show()

    return


显示结果如下:




2017.04.25

2016-03-10 23:04:31 HorizontalView 阅读数 2000
  • 深度学习图像处理之垃圾分类

    图像分类是图像处理领域的基本任务,同时也是深度学习领域的“Hello Word”,掌握好相关的基础知识,才能更好地开展识别、分割、去噪等更加复杂的任务。本课程将以当下最火热的垃圾分类作为主题,手把手地带领大家实现图像分类任务的完整过程。课程可以分为三个板块: (1)深度学习在图像处理领域的发展过程; (2)解析经典的卷积神经网络; (3)垃圾分类实战。本课程将使用Pytorch深度学习框架进行实战,并在ubuntu系统上进行演示,包括:不同标注文件下的数据集读取、编写卷积神经网络、训练垃圾分类数据集、测试训练网络模型、网络可视化、性能评估等。

    581 人正在学习 去看看 郭冰洋

图像处理笔记 —— 图像的读取及RGB分离等



一. 图像的读取

matlab中图像的读取主要是 imread 函数,imread 函数需要输入您要读取的图片的路径,返回一个图像矩阵,如果是彩色图返回一个三维矩阵,如256*256*3,其中256×256是指图像中的维数256×256,后面的3位为RGB每个8bit的数值,其中(:,:,1)为红色,(:,:,2)为绿色,(:,:,3)为蓝色;如果是灰度表示的图片,则返回一个二维矩阵,如256*256,其中256×256是指图像中的维数256×256。

figure('NumberTitle','off','Name','原图');    % 图像显示窗口的设置
img = imread('4.1.06.tiff');            %图片读取
imshow(img);   %图片显示
title('原图');  %图片的 标题

二. RGB三元素的分离

在进行图像处理时,一般需要RGB三原色的分离,以下代码即为分离过程:先从图像矩阵中分别提取出三原色,然后分别显示,详情见代码注释

[r,c,z] = size(img);        %提取图像矩阵维数
red =zeros(256,256,3);      %分为构造红色,绿色,蓝色的图像矩阵
green =zeros(256,256,3);
blue =zeros(256,256,3);

subplot(222);           
red(:,:,1) = img(:,:,1);    %提取红色的色彩值
red=uint8(red);         %将double类型转换成8bits类型
imshow(red);            %显示仅有的红色图片
title('红色分离');

subplot(223);
green(:,:,2) = img(:,:,2);
green=uint8(green);
imshow(green);
title('绿色分离');

subplot(224);
blue(:,:,3) = img(:,:,3);
blue=uint8(blue);
imshow(blue);
title('蓝色分离');

三. 把彩色图片转化成灰度图片

在做图像处理时,经常会将彩色图片转换成灰度图来进行表示,matlab 给我们提供了很好的函数来进行转换,详情见源码:

I = rgb2gray(img);  %转换函数,输入为彩色图像矩阵,输出为灰度图像矩阵
figure(3);
imshow(I);

2018-04-12 18:17:22 weiwei9363 阅读数 12030
  • 深度学习图像处理之垃圾分类

    图像分类是图像处理领域的基本任务,同时也是深度学习领域的“Hello Word”,掌握好相关的基础知识,才能更好地开展识别、分割、去噪等更加复杂的任务。本课程将以当下最火热的垃圾分类作为主题,手把手地带领大家实现图像分类任务的完整过程。课程可以分为三个板块: (1)深度学习在图像处理领域的发展过程; (2)解析经典的卷积神经网络; (3)垃圾分类实战。本课程将使用Pytorch深度学习框架进行实战,并在ubuntu系统上进行演示,包括:不同标注文件下的数据集读取、编写卷积神经网络、训练垃圾分类数据集、测试训练网络模型、网络可视化、性能评估等。

    581 人正在学习 去看看 郭冰洋

本文完整代码在 https://github.com/jiemojiemo/Tensorflow_Demo/blob/master/image_loader.ipynb

Tensorflow图像处理以及数据读取

本人研究的方向是图像处理,这个领域几乎被深度学习的方法给统治了,例如图像去燥、图像超分辨、图像增强等等。在模拟实现相关论文的方法时,我发现最难的部分并不是深度学习的网络,而是如何构建你的训练集。通常,为了构建一个可训练的数据库我需要做:

  1. 上网找到论文提到的图像数据库,或者自己收集图像
  2. 对图像进行处理,构建训练所需的数据库,处理的方式各种各样,包括

    • 图像颜色域的变化,例如RGB转HSV,RGB转Gray等等
    • 图像大小的缩放,例如将不同大小的图像缩放为大小一致的图像
    • 提前图像块(image patch),就是从整张图像中,扣下小块(例如32*32)的小图像,这么做主要是因为可以增加训练数据的量,另外小块的图像训练起来速度更快,image patch的合理性是基于卷积神经网络的感受野(Receptive field)通常不会太大
    • 数据增强(Data augmentation),例如将图像上下翻转,左右翻转,裁剪,旋转等等。这里有一篇Keras-5 基于 ImageDataGenerator 的 Data Augmentation实现可以让大家大致明白什么是Data augmentation
  3. 为了训练,给深度网络喂数据,我还需要写batch generator,就是用来生成一个batch的东西

一般,我们对整个训练过程有两种方案
1. 构建数据库的部分是独立,也就是说我们对找到的图像做预处理,将预处理的结果保存起来,这就算构建好训练的数据库了,然后训练时从这数据库里直接拿数据进行训练
2. 训练时实时地预处理一个batch的图像,将处理的结果作为训练的输入

第一种方法将训练集的构建和网络的训练分开,并且将预处理结果存在电脑中,这样做训练的代码会比较简单,且直接读入处理好的数据能让训练速度更快,当然,不足的地方就是不够灵活,如果预处理的方式改变了(例如,原本是RGB转HSV,现在我要RGB转Gray),那么需要重新构建一个数据库,造成硬盘空间的浪费

第二种方法虽然训练速度不如第一种,但是足够灵活,我们主要关注第二种方法。

在TensorFlow中,图像处理主要由tf.image模块支持,batch generator主要用tf.data.Dataset实现,下面我们来看看整个流程的具体实现

1 获取所有图片的路径

很明显,如果训练集很大,图片很多,我们无法一次读取所有图片进行训练,因此我们先找到所有图片的路径,在需要读取图片时再根据路径读取图片

import glob
# images_dir 下存放着需要预处理的图像
images_dir = '/home/public/butterfly/dataset_detection/JPEGImages/'

# 查找图片文件, 根据具体数据集自由添加各种图片格式(jpg, jpeg, png, bmp等等)
images_paths = glob.glob(images_dir+'*.jpg')
images_paths += glob.glob(images_dir+'*.jpeg')
images_paths += glob.glob(images_dir+'*.png')
print('Find {} images, the first 10 image paths are:'.format(len(images_paths)))
for path in images_paths[:10]:
    print(path)
Find 717 images, the first 10 image paths are:
/home/public/butterfly/dataset_detection/JPEGImages/IMG_001000.jpg
/home/public/butterfly/dataset_detection/JPEGImages/IMG_000969.jpg
/home/public/butterfly/dataset_detection/JPEGImages/IMG_000805.jpg
/home/public/butterfly/dataset_detection/JPEGImages/IMG_000158.jpg
/home/public/butterfly/dataset_detection/JPEGImages/IMG_001017.jpg
/home/public/butterfly/dataset_detection/JPEGImages/IMG_001155.jpg
/home/public/butterfly/dataset_detection/JPEGImages/IMG_001404.jpg
/home/public/butterfly/dataset_detection/JPEGImages/IMG_000202.jpg
/home/public/butterfly/dataset_detection/JPEGImages/IMG_000568.jpg
/home/public/butterfly/dataset_detection/JPEGImages/IMG_000022.jpg
import numpy as np
# split training set and test data
test_split_factor = 0.2
n_test_path = int(len(images_paths)*test_split_factor)
# 转出numpy数据,方便使用
train_image_paths = np.asarray(images_paths[:-n_test_path])
test_image_paths = np.asarray(images_paths[-n_test_path:])
print('Number of train set is {}'.format(train_image_paths.shape[0]))
print('Number of test set is {}'.format(test_image_paths.shape[0]))
Number of train set is 574
Number of test set is 143

2. Batch Generator

我们将使用tf.data.Dataset来实现batch generator,这里借鉴了一篇博客 TensorFlow全新的数据读取方式:Dataset API入门教程。我们直接上代码,具体解释请看注释

def gaussian_noise_layer(input_image, std):
    noise = tf.random_normal(shape=tf.shape(input_image), mean=0.0, stddev=std, dtype=tf.float32)
    noise_image = tf.cast(input_image, tf.float32) + noise
    noise_image = tf.clip_by_value(noise_image, 0, 1.0)
    return noise_image

def parse_data(filename):
    '''
    导入数据,进行预处理,输出两张图像,
    分别是输入图像和目标图像(例如,在图像去噪中,输入的是一张带噪声图像,目标图像是无噪声图像)
    Args:
        filaneme, 图片的路径
    Returns:
        输入图像,目标图像
    '''
    # 读取图像
    image = tf.read_file(filename)
    # 解码图片
    image = tf.image.decode_image(image)

    # 数据预处理,或者数据增强,这一步根据需要自由发挥

    # 随机提取patch
    image = tf.random_crop(image, size=(100,100, 3))
    # 数据增强,随机水平翻转图像
    image = tf.image.random_flip_left_right(image)
    # 图像归一化
    image = tf.cast(image, tf.float32) / 255.0
    # 加噪声
    n_image =gaussian_noise_layer(image, 0.5)

    return n_image, image
def train_generator(batchsize, shuffle=True):
    '''
    生成器,用于生产训练数据
    Args:
        batchsize,训练的batch size
        shuffle, 是否随机打乱batch

    Returns:
        训练需要的数据
    '''

    with tf.Session() as sess:
        # 创建数据库
        train_dataset = tf.data.Dataset().from_tensor_slices((train_image_paths))
        # 预处理数据
        train_dataset = train_dataset.map(parse_data)
        # 设置 batch size
        train_dataset = train_dataset.batch(batchsize)
        # 无限重复数据
        train_dataset = train_dataset.repeat()
        # 洗牌,打乱
        if shuffle:
            train_dataset = train_dataset.shuffle(buffer_size=4)

        # 创建迭代器
        train_iterator = train_dataset.make_initializable_iterator()
        sess.run(train_iterator.initializer)
        train_batch = train_iterator.get_next()

        # 开始生成数据
        while True:
            try:
                x_batch, y_batch = sess.run(train_batch)
                yield (x_batch, y_batch)
            except:
                # 如果没有  train_dataset = train_dataset.repeat()
                # 数据遍历完就到end了,就会抛出异常
                train_iterator = train_dataset.make_initializable_iterator()
                sess.run(train_iterator.initializer)
                train_batch = train_iterator.get_next()
                x_batch, y_batch = sess.run(train_batch)
                yield (x_batch, y_batch)
import matplotlib.pyplot as plt
%matplotlib inline
#%config InlineBackend.figure_format='retina'

# 显示图像
def view_samples(samples, nrows, ncols, figsize=(5,5)):
    fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=figsize, sharey=True, sharex=True)

    for ax, img in zip(axes.flatten(), samples):
        ax.axis('off')
        ax.set_adjustable('box-forced')
        im = ax.imshow(img, aspect='equal')

    plt.subplots_adjust(wspace=0, hspace=0)
    plt.show()
    return fig, axes
# 测试一下我们的代码
train_gen = train_generator(16)

iteration = 5
for i in range(iteration): 
    noise_x, x = next(train_gen)
    _ = view_samples(noise_x, 4,4)
    _ = view_samples(x, 4, 4)

png

png

总结

TensorFlow提供了一整套图像预处理以及数据生成的机制,我们实现了一个简单的常用的数据处理框架,总结为三步
1. 获取所有图片的路径
2. 写好预处理的代码(parse_data)
3. 定义好数据生成器
基于以上的流程,稍微加以修改就能够应对大部分训练要求

2019-10-13 10:49:06 qq_41887833 阅读数 78
  • 深度学习图像处理之垃圾分类

    图像分类是图像处理领域的基本任务,同时也是深度学习领域的“Hello Word”,掌握好相关的基础知识,才能更好地开展识别、分割、去噪等更加复杂的任务。本课程将以当下最火热的垃圾分类作为主题,手把手地带领大家实现图像分类任务的完整过程。课程可以分为三个板块: (1)深度学习在图像处理领域的发展过程; (2)解析经典的卷积神经网络; (3)垃圾分类实战。本课程将使用Pytorch深度学习框架进行实战,并在ubuntu系统上进行演示,包括:不同标注文件下的数据集读取、编写卷积神经网络、训练垃圾分类数据集、测试训练网络模型、网络可视化、性能评估等。

    581 人正在学习 去看看 郭冰洋

f = imread('F:\学习\研一上\数字图像处理\数字图像处理\作业1\rose.tif');
size (f)
whos f
imshow(f,[])
imwrite(f,'F:\学习\研一上\数字图像处理\数字图像处理\作业1\保存.tif')

f1 = imread('F:\学习\研一上\数字图像处理\数字图像处理\作业1\bubbles.tif');
size (f1)
figure,imshow(f1,[])
q=25;
imwrite(f1,'F:\学习\研一上\数字图像处理\数字图像处理\作业1\保存泡泡25.jpg','quality',q)

f2 = imread('F:\学习\研一上\数字图像处理\数字图像处理\作业1\保存泡泡25.jpg');
K = imfinfo('保存泡泡25.jpg')

image_bytes = K.Width*K.Height*K.BitDepth/8;
compressed_bytes = K.FileSize;
compression_ratio = image_bytes/compressed_bytes

f3 = imread('F:\学习\研一上\数字图像处理\数字图像处理\作业1\PCB.tif');
figure,imshow(f3,[])
res = round(200*2.25/1.5)
imwrite(f3,'F:\学习\研一上\数字图像处理\数字图像处理\作业1\修改尺寸后的PCB.tif','compression','none','resolution',res)
f4 = imread('修改尺寸后的PCB.tif');
figure,imshow(f4,[])


 

Python图像读取

阅读数 994

VTK序列图像的读取

阅读数 8742

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