数字图像学习笔记

xiaoxiao2021-02-28  101

一、开篇

        学习了一段数字图像处理,想就自己的学习写个笔记吧。主要的参考书就是<<数字图像处理的MATLAB实现>>和网上的一些博客,可能会穿插着MATLAB的代码和Python的代码,准备写一个系列,这次就当做是个开山篇吧。

        什么叫数字图像呢? “一幅图像可以定义为一个二维函数f(x,y),这里的x和y是空间坐标,而在任意坐标(x,y)处的幅度f被称为这一坐标位置图像的亮度或者灰度,当x,y和f的幅值都是有限的离散值是,称图形为数字图像。”——引自<<数字图像处理的MATLAB实现>>。基本的意思我理解就是把一幅图像看成是一系列的像素点组成的,位置坐标是(0,0),(0,1)………组成下去,但是不是连续的是离散的就是说不会有(0.5,0.5)这样的坐标出现,每个坐标位置都有一个值代表着某些含义,可能是灰度或者亮度之类的。         准备写的就是关于以下的几个方面:        (1)图像处理的基本操作(旋转、剪切、灰度变换等)        (2)滤波和形态学处理以及分割等等        (3)其他的一些东西         环境:win7+Matlab2014a/Python2.7

二、续集

接着上次的写。。。 首先介绍下本次使用的环境,win7+python2.7.3+epd_free-7.3-1+Pil1.1.7 epd的相关信息参考我的另一篇博文http://blog.csdn.net/gavin__zhou/article/details/46851495,上面讲的很详细,pil(Python image library)是一个python的图像处理库,大家自行网上搜索下载。 写的代码都是在Ipython下,IPython比较方便好用最关键是比起Python自带的IDLE多了代码提示功能,很赞啊有木有【泪奔】,画图之类的需要Matplotlib的支持,这些参照我的博文装完EPD这些都有了,大家不用担心。。。。。。。 首先需要导入Image,只要你装了PIL这些应该都有了,可以使用Image.open()打开一个图片,支持常见的JPG、PNG等类型。imshow就是将图像显示出来,这直接调用的是Matplotlib,但默认是翻转显示的,我们需要给他翻转回来。 或者也可以使用im.show()这个调用的是系统的默认图片浏览器打开这个图。 **Image类有以下几个属性: mode:图像的模式 format:文件格式 size:大小 palette:调色板属性,针对mode为”P” info:包含图像相关数据的字典** 重点说一下图像的模式: 可以看出这个图是RGB图像,大小750*496,JPEG格式 裁剪:

box = (0,0,100,100) //获得一个区域 region = im.crop(box) im.show(region) 123 123

粘贴

region = region.rotate(180) //旋转180度 im.paste(region,box) //原来的位置粘贴回去 12 12

注意和上面的原图对比 分离通道

r,g,b = im.split() 1 1获得r g b三个分量

三、续集--色彩空间变换

灰度化:

f = imread('C:\Users\Administrator\Desktop\1.jpg'); gray = rgb2gray(f); %灰度化 12 12

二值化:

bw = im2bw(f); %默认的二值 bw1 = im2bw(f,graythresh(f)); %使用全局阈值处理的logical图像 12 12

从RGB空间到HSV空间:

hsv = rgb2hsv(f); 1 1

获得其相应的H 、S和 V分量

subplot(2,2,1),imshow(hsv(:,:,1)) subplot(2,2,2),imshow(hsv(:,:,2)) subplot(2,2,3),imshow(hsv(:,:,3)) subplot(2,2,4),imshow(hsv) 1234 1234

当然还可以转到YCbCr空间,

cbr = rgb2ycbcr(f); 1 1

转到NTSC彩色空间,

ntsc = rgb2ntsc(f); 1 1

四、数学上进行图像处理的分析

这次就介绍下如何对一幅数字图像进行数学上的相关处理,实质就是对矩阵进行数学运算,以求一幅图像的灰度图的最大灰度、最小灰度和平均灰度值和图像的马赛克为例。 首先将图像读入进来:

>> f = imread('C:\Users\Administrator\Desktop\1.jpg'); >> imshow(f)

将原始的图像转换为灰度图并获得大小:

>> gray = rgb2gray(f); >> [rows,cols]=size(gray); 1

对矩阵进行运算获得相关的值:

for i = 1:rows for j = 1:cols if gray(i,j) > max max = gray(i,j); end if gray(i,j) < min min = gray(i,j); end avg = avg + gray(i,j); end end %输出最大最小和平均值 max min avg = avg/(rows*cols) 123456789101112131415161718

生成马赛克图像我参考的是这个,原理就是对邻域像素平均值赋给邻域中的所有像素,代码是直接粘过来的。

clear all; close all;clc; img=imread('C:\Users\Administrator\Desktop\1.jpg'); img = rgb2gray(img); imshow(img,[]); [h,w]=size(img); imgn=zeros(h,w); n=12; nw=floor(w/n)*n; nh=floor(h/n)*n; for y=1:n:nh for x=1:n:nw imgn(y:y+n-1,x:x+n-1)=mean(mean(img(y:y+n-1,x:x+n-1))); end imgn(y:y+n-1,nw+1:w)=mean(mean(img(y:y+n-1,nw+1:w))); %处理最后一列 imgn(y,1:w)=128; end for x=1:n:nw imgn(nh+1:h,x:x+n-1)=mean(mean(img(nh+1:h,x:x+n-1))); %处理最后一行 imgn(1:h,x)=128; end imgn(nh+1:h,nw+1:w)=mean(mean(img(nh+1:h,nw+1:w))); %处理最后一个角 imgn(1:h,nw)=128; imgn(1:h,w)=128; imgn(nh,1:w)=128; imgn(h,1:w)=128; figure;imshow(imgn,[]) 1234567891011121314151617181920212223242526272829303132333435

下面介绍个简单实现马赛克图像的方法,就是对图形进行缩小再放大回原来的大小(或者缩小放大调换),则会产生像素点的丢失,视觉效果就像马赛克

IMG = imread('C:\Users\Administrator\Desktop\1.jpg'); pix_grp = 10; %此数值越大马赛克效果越明显 [widt,height,deep] = size(IMG); mosaic = imresize(IMG,[floor(height/pix_grp) floor(widt/pix_grp)]); %缩小图像 mosaic = imresize(mosaic,[widt,height],'nearest'); %放大图像 imshow(mosaic); 123456

转载请注明原文地址: https://www.6miu.com/read-55159.html

最新回复(0)