2020-02-23 19:00:00 xyl666666 阅读数 12

遍识天下英雄路,俯首江左有梅郎。

前言

     大家好,我们又见面了,在上一期的文章中,我们简单的讲解了图像的数据形式以及三通道彩色图像的通道分离,通道分离的意义在于,我们在进行图像处理的时候可能并不需要三个通道的数据仅仅一个通道就可以解决了,因此,采用单个通道的数据可以使得图像处理节省更多的时间,关于上期的文章,见文末。当然通道分离也有其他的作用,先卖个关子,我们后期再叙,一起来看看今天的文内容吧

01

PART

图像切割

1.1 图像切割简介

      图像切割的意思是截取图像的某一部分,达到分割的目的。

      

我们来看一下原始图像:

       显然这是一幅雪景图,如果把这个图像画两条水平和竖直的对称轴,图像就可以被分为四块,现在我们想要截取图像的左上角这一块该怎么做呢?接着往下看吧!

1.2 代码实践

#coding:utf-8
import numpy as np
import cv2


# 指定图像文件路径(此处使用相对地址)
img_path = './04.jpg'
# 读取图像
img = cv2.imread(img_path)
image_width = img.shape[1]
image_height = img.shape[0]
# 裁剪图像,0,0代表图像左上角的坐标(起始坐标)
# 左上部分截取
imCrop_left_top = img[0 : image_height//2, 0:image_width//2]
# 左下部分截取
imCrop_left_down = img[image_height//2 : image_height, 0:image_width//2]
#右上部分截取
imCrop_right_top = img[0 : image_height//2, image_width//2:image_width]
#右下部分截取
imCrop_right_down = img[image_height//2 : image_height, image_width//2:image_width]
# Display cropped image
# 显示左上图像
cv2.imshow("left_top", imCrop_left_top)
# 显示左下图像
cv2.imshow("left_down", imCrop_left_down)
cv2.imshow("right_top", imCrop_right_top)
cv2.imshow("right_down", imCrop_right_down)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码解读:

在上面的代码中,我们主要注意的是图像截取代码:

img[0 : image_height//2, 0:image_width//2]

其中:

0,0位置的值代表的是截取图像的左上角起始点。

image_height//2image_width//2位置的值代表截取图像的高度和宽度。

由此,我们可以截取从0,0,出发,

高度为:image_height//2, 

宽度为:image_width//2的图像。

为了方便,小编把图像四个部分的代码也写在里面了哦。

1.3 效果展示

左上:

左下:

02

PART

ROI截取

2.1 ROI简介

       从上面的例子中,我们可以看到,要截取图像的某一部分,我们必须首先要知道图像的起始点和宽度,高度信息,这样一来,显得十分麻烦,那么,我们是否可以采用鼠标截取的方式,直接得到图像的坐标信息呢?下面我们就来用函数的方式实现吧!

2.2 代码实践

#coding:utf-8
import numpy as np
import cv2
# 指定文件路径
img_path = './04.jpg'
# Read image
img = cv2.imread(img_path)


# 创建一个窗口
#cv2.namedWindow("image", flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO)
#cv2.namedWindow("image_roi", flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO)


cv2.imshow("image", img)
# 是否显示网格 
showCrosshair = False
# 如果为Ture的话 , 则鼠标的起始位置就作为了roi的中心
# False: 从左上角到右下角选中区域
fromCenter = False
# 选择 ROI(感兴趣的部分)图像
rect = cv2.selectROI("image", img, showCrosshair, fromCenter)
(x, y, w, h) = rect


# 截取的图像
imCrop = img[y : y+h, x:x+w]
# 显示截取图像
cv2.imshow("image_roi", imCrop)
#cv2.imwrite("image_roi.jpg", imCrop)
cv2.waitKey(0)

代码解读:

该代码中,主要注意的地方在于这个函数:

cv2.selectROI("image", img, showCrosshair, fromCenter)

参数解释
"image" : winName 窗口名称
img : 目标想要裁剪的图像
showCrosshair : 是否显示网格
True :显示网格
False :只有矩形
fromCenter:
True: 第一次选中的点为矩形的中心.
False: 第一次选中的点为矩形的左上角.
返回的是一个tuple值, 代表矩形区域. 分别代表矩形左上角坐标 (x, y) 与矩形宽度w跟高度h
(x, y, w, h) = rect
切片的时候一定要注意, 第一维指的是行数, 第二维度指的是列数.
imCrop = img[y : y+h, x:x+w]

2.3 显示效果

      运行代码后,用鼠标从左到右画框显示。

截取后:

结语

     今天分享的内容到此结束了,虽然短暂,但是需要消化的东西却不少,我们的文章很少出现长篇大论,因此,不管你忙不忙,我们的每一篇文章你都有足够的时间去实践,期待粉丝朋友们的一步步提升,不求甚多,略有小助,足矣。

编辑:玥怡居士|审核:小圈圈居士

往期精彩回顾

【图像篇】OpenCV图像处理(三)---图像数据&通道分离

【图像篇】OpenCV图像处理(二)---图像读取与显示

【图像篇】opencv图像处理(一)---图像基础知识

【年终总结】辞旧迎新,2020,我们再出发

扫码关注我们

嗨,你还在看吗?

2020-01-02 16:19:33 xranmail 阅读数 43

图像处理的基本步骤:获取图像数据—— 平滑处理 —— 边缘检测/阈值分析 —— 形态学操作 —— 获取某些特征点 —— 分析数据

二值化变换(binary transformation):图像分割的一种方法。在二值化图象的时候把大于某个临界灰度值的像素灰度设为灰度极大值,把小于这个值的像素灰度设为灰度极小值,实现二值化。根据阈值选取的不同,二值化的算法分为固定阈值和自适应阈值。 常用的二值化方法:双峰法、P参数法、迭代法和OTSU法等。
阈值变换(threshold transformation):灰度的阈值变换是指将一幅灰度图像变为黑白二值图像,首先指定一个阈值,如果图像中的某像素值小于这个阈值,则将该像素的灰度值设置为0,否则,将该像素的灰度值设置为255。阈值的选取同二值化一样。
傅立叶变换(Fourier transform):图像处理中傅里叶变换理解为:将一个复杂无规律的图像拆分成多个简单有规律的子图像来表示。由于图像中表达距离的单位是像素大小,所以频率可理解为N个像素内灰度值完成周期性变化的次数。傅里叶变换以前,图像是由对在连续空间上的采样得到一系列点的集合,由z=f(x,y)来表示。从物理效果看,傅里叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。即将图像的灰度分布函数变换为图像的频率分布函数,傅里叶逆变换是将图像的频率分布函数变换为灰度分布函数。傅里叶中由三个分量编码:频率、幅值、相位描述正弦图像中的所有信息。在频域中,图像的幅值表示了图像中最明和最暗的峰值之间的差,相位表示了相对于原始波形,这个波形的偏移量。频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。频率越大说明原始信号变化速度越快,频率越小说明原始信号越平缓。当频率为0时,表示直流信号,没有变化。因此,频率的大小反应了信号的变化快慢。高频分量解释信号的突变部分,而低频分量决定信号的整体形象。在图像处理中,频域反应了图像在空域灰度变化剧烈程度,也就是图像灰度的变化速度,或图像的梯度大小。对图像而言,图像的边缘部分是突变部分,变化较快,因此反应在频域上是高频分量;图像的噪声大部分情况下是高频部分;图像平缓变化部分则为低频分量。也就是说,傅立叶变换提供一条从空域到频率自由转换的途径来观察图像,可以将图像从灰度分布转化到频率分布上来观察图像的特征。  
图像平滑(image smoothing): 压制、弱化或消除图像中的细节、突变、边缘和噪声,就是图像平滑化。图像平滑是对图像作低通滤波,可在空间域或频率域实现。空间域图像平滑方法主要用低通卷积滤波、中值滤波等;频率域图像平滑常用的低通滤波器有低通梯形滤波器、低通高斯滤波器、低通指数滤波器、巴特沃思低通滤波器等。
高斯滤波(Gaussion filter):高斯滤波是一种线性平滑滤波,即低通滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由本身和邻域内的其他像素值经过加权平均后得到。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。
均值滤波(mean filter):均值滤波是典型的线性滤波算法,是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
中值滤波(median filter):中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。
边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括1)深度上的不连续、2)表面方向不连续、3)物质属性变化和4)场景照明变化。在OpenCV中,边缘检测的方法有以下几种:Sobel,Scharr,Laplace,Canny.其中前三种的边缘检测是带方向的。
-Sobel算子(Sobel operator):图像处理中的算子之一,主要用作边缘检测,结合了高斯平滑和微分求导。在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量。具体计算将图像矩阵分别与内核[-1 0 1, -2 0 2, -1 0 1]和内核[-1 -2 1, 0 0 0, -1 2 1](ksize=3)进行卷积得到Gx,Gy,在图像每一点求出近似梯度G=\sqrt{(G_x^2+G_y^2)}|G_x|+|G_y|
-Scharr滤波器:当内核大小为3时, Sobel内核可能产生比较明显的误差,使用[-3 0 3,-10 0 10,-3 0 3]代替原来内核结果更加精确。
-Laplacian算子:Laplace利用Sobel算子的运算,它通过Sobel算子运算出图像在x方向和y方向的导数,来得到载入图像的拉普拉斯变换结果,Laplace的轮廓更为清晰。
-Canny边缘检测:是一个多阶段的算法,即由多个步骤构成。1.图像降噪;2.计算图像梯度;3.非极大值抑制;4.阈值筛选。
形态学操作:形态学操作就是改变物体的形状。基本的运算包括:二值腐蚀和膨胀、二值开闭运算、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。膨胀就是求局部最大值的操作,膨胀或者腐蚀操作就是将图像(或图像的一部分区域)与核进行卷积
图像金字塔:是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
霍夫变换:Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。
随机抽样一致算法RANSAC(Random Sample Consensus):它是根据一组包含异常数据的样本数据集,计算出数据的数学模型参数,得到有效样本数据的算法。RANSAC算法经常用于计算机视觉中。如在立体视觉领域中同时解决一对相机的匹配点问题及基本矩阵的计算。RANSAC基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。关于OpenCV中使用到RANSAC的相关函数:solvePnPRansac, findFundamentalMat.
PnP(Perspective-N-Project)透视N点投影:PNP(perspective-n-point)是通过一组匹配好的3D点和2D点来求解两帧图像之间运动的一种算法。PNP的求解有DLT(直接线性变换)、P3P、EPNP和BA优化等方式。而BA优化是SLAM中的最核心算法,通过BA求解PNP和SLAM系统后端优化中的BA原理相同。其差别只在于PNP问题仅仅包含两帧图像的位姿,而后端中的BA优化则包含多个图像的位姿。BA(bundle adjustment)指的是同时调整相机姿态和特征点位置,以便从每个特征点反射出的光线通过调整最后都能通过相机光心。也有人翻译为光束平差法。BA通常构建为一个最小二乘问题,通过使重投影误差最小化来同时调整相机的位姿和特征点的坐标。重投影顾名思义就是把 3d空间中的点重新投影到图像平面上。用数学公式表达就是相机的成像过程。

2017-11-01 01:05:36 mao_hui_fei 阅读数 10473

选取图像局部区域
Mat 类提供了多种方便的方法来选择图像的局部区域。 使用这些方法时需要注意,这些方法并不进行内存的复制操作。如果将局部区域赋值给新的 Mat 对象,新对象与原始对象共用相同的数据区域,不新申请内存,因此这些方法的执行速度都比较快。

1 单行或单列选择
提取矩阵的一行或者一列可以使用函数 row()或 col()。函数的声明如下:

Mat Mat::row(int i) const
Mat Mat::col(int j) const

参数 i 和 j 分别是行标和列标。例如取出 A 矩阵的第 i 行可以使用如下代码:

Mat line = A.row(i);

例如取出 A 矩阵的第 i 行,将这一行的所有元素都乘以 2,然后赋值给第 j行,可以这样写:

A.row(j) = A.row(i)*2;

2 用 Range 选择多行或多列

Range 是 OpenCV 中新增的类,该类有两个关键变量 star 和 end。 Range 对象可以用来表示矩阵的多个连续的行或者多个连续的列。其表示的范围为从 start到 end,包含 start,但不包含 end。 Range 类的定义如下:

class Range
{
public:
...
int start, end;
};

Range 类还提供了一个静态方法 all(),这个方法的作用如同 Matlab 中的“:”,表示所有的行或者所有的列。

//创建一个单位阵
Mat A = Mat::eye(10, 10, CV_32S);
//提取第 13 列(不包括 3)
Mat B = A(Range::all(), Range(1, 3));
//提取 B 的第 59 行(不包括 9)
//其实等价于 C = A(Range(5, 9), Range(1, 3))
Mat C = B(Range(5, 9), Range::all());

3 任意感兴趣区域

从图像中提取感兴趣区域(Region of interest) 有两种方法,一种是使用构造函数,如下例所示:

//创建宽度为 320,高度为 240 的 3 通道图像
Mat img(Size(320,240),CV_8UC3);
//roi 是表示 img 中 Rect(10,10,100,100)区域的对象
Mat roi(img, Rect(10,10,100,100));

除了使用构造函数,还可以使用括号运算符, 如下:

Mat roi2 = img(Rect(10,10,100,100));

当然也可以使用 Range 对象来定义感兴趣区域,如下:

//使用括号运算符
Mat roi3 = img(Range(10,100),Range(10,100));

//使用构造函数
Mat roi4(img, Range(10,100),Range(10,100));

4 取对角线元素
矩阵的对角线元素可以使用 Mat 类的 diag()函数获取,该函数的定义如下:

Mat Mat::diag(int d) const

参数 d=0 时,表示取主对角线;
当参数 d>0 时,表示取主对角线下方的次对角线,如 d=1 时,表示取主对角线下方,且紧贴主多角线的元素;
当参数 d<0 时,表示取主对角线上方的次对角线。
如同 row()和 col()函数, diag()函数也不进行内存复制操作,其复杂度也是 O(1)。

2013-12-04 14:14:41 dianmao0917 阅读数 1386
  Matlab中的图像数据类型转换 
MATLAB中读入图像的数据类型是uint8,而在矩阵中使用的数据类型是double因此 I2=im2double(I1) :把图像数组I1转换成double精度类型;如果不转换,在对uint8进行加减时会产生溢出,可能提示的错误为:Function '*' is not defined for values of class 'uint8'。

 

图像数据类型转换函数

默认情况下,matlab将图像中的数据存储为double型,即64位浮点数;matlab还支持无符号整型(uint8和uint16);uint型的优势在于节省空间,涉及运算时要转换成double型。
    im2double():将图像数组转换成double精度类型
     im2uint8():将图像数组转换成unit8类型 

     im2uint16():将图像数组转换成unit16类型


但是:对double型图像用im2uint8(),会出现问题。double默认为0-1之间的数,uint8为0-255之间的数,如果数组uint8型x1={0,1,2},转化后为x2={0,0.5,1}; 如果数组double型y1={0,1,2},转化后为y2={0,255,255};

在用matlab工具箱做直方图处理时,图像必须为整型,即如果是double型,必须转化为整型

解决办法:


图像处理工具箱
1. 图像和图像数据
   缺省情况下,MATLAB将图像中的数据存储为双精度类型(double),64位浮点
数,所需存储量很大;MATLAB还支持另一种类型无符号整型(uint8),即图像矩
阵中每个数据占用1个字节。
   在使用MATLAB工具箱时,一定要注意函数所要求的参数类型。另外,uint8
与double两种类型数据的值域不同,编程需注意值域转换。
          从uint8到double的转换
   ---------------------------------------------
       图像类型        MATLAB语句
   ---------------------------------------------
     索引色             B=double(A)+1
     索引色或真彩色 B=double(A)/255
     二值图像          B=double(A)
   ---------------------------------------------

         从double到uint8的转换
   ---------------------------------------------
       图像类型        MATLAB语句
   ---------------------------------------------
    索引色               B=uint8(round(A-1))
    索引色或真彩色    B=uint8(round(A*255))
    二值图像            B=logical(uint8(round(A)))
   ---------------------------------------------

2. 图像处理工具箱所支持的图像类型

2.1 真彩色图像
    R、G、B三个分量表示一个像素的颜色。如果要读取图像中(100,50)处的像素值,
可查看三元数据(100,50,1:3)。
    真彩色图像可用双精度存储,亮度值范围是[0,1];比较符合习惯的存储方法是用无
符号整型存储,亮度值范围[0,255]
   
2.2 索引色图像
   包含两个结构,一个是调色板,另一个是图像数据矩阵。调色板是一个有3列和若干行
的色彩映象矩阵,矩阵每行代表一种颜色,3列分别代表红、绿、蓝色强度的双精度数。
   
   注意:MATLAB中调色板色彩强度[0,1],0代表最暗,1代表最亮。
          常用颜色的RGB值
   --------------------------------------------
    颜色    R   G   B      颜色    R   G   B 
   --------------------------------------------
     黑     0   0   1      洋红    1   0   1
     白     1   1   1      青蓝    0   1   1
     红     1   0   0      天蓝 0.67 0   1
     绿     0   1   0      橘黄    1 0.5 0
     蓝     0   0   1      深红   0.5 0   0
     黄     1   1   0       灰    0.5 0.5 0.5       
   --------------------------------------------
         产生标准调色板的函数
   -------------------------------------------------
    函数名       调色板
   -------------------------------------------------
     Hsv       色彩饱和度,以红色开始,并以红色结束
     Hot       黑色-红色-黄色-白色
     Cool      青蓝和洋红的色度
     Pink      粉红的色度
     Gray      线型灰度
     Bone      带蓝色的灰度
     Jet        Hsv的一种变形,以蓝色开始,以蓝色结束
     Copper    线型铜色度
     Prim       三棱镜,交替为红、橘黄、黄、绿和天蓝
     Flag       交替为红、白、蓝和黑
--------------------------------------------------
   缺省情况下,调用上述函数灰产生一个64×3的调色板,用户也可指定调色板大小。
   
   索引色图像数据也有double和uint8两种类型。
   当图像数据为double类型时,值1代表调色板中的第1行,值2代表第2行……
   如果图像数据为uint8类型,0代表调色板的第一行,,值1代表第2行……

2.3 灰度图像
   存储灰度图像只需要一个数据矩阵。
   数据类型可以是double,[0,1];也可以是uint8,[0,255]

2.4 二值图像
   二值图像只需一个数据矩阵,每个像素只有两个灰度值,可以采用uint8或double类型存储。
   MATLAB工具箱中以二值图像作为返回结果的函数都使用uint8类型。

2.5 图像序列
   MATLAB工具箱支持将多帧图像连接成图像序列。
   图像序列是一个4维数组,图像帧的序号在图像的长、宽、颜色深度之后构成第4维。
   分散的图像也可以合并成图像序列,前提是各图像尺寸必须相同,若是索引色图像,
调色板也必须相同。
   可参考cat()函数    A=cat(4,A1,A2,A3,A4,A5)

3. MATLAB图像类型转换
         图像类型转换函数
   ---------------------------------------------------------------------------
     函数名                      函数功能
   ---------------------------------------------------------------------------
     dither       图像抖动,将灰度图变成二值图,或将真彩色图像抖动成索引色图像
    gray2ind    将灰度图像转换成索引图像
    grayslice    通过设定阈值将灰度图像转换成索引色图像
     im2bw      通过设定亮度阈值将真彩色、索引色、灰度图转换成二值图
    ind2gray    将索引色图像转换成灰度图像
    ind2rgb      将索引色图像转换成真彩色图像
    mat2gray   将一个数据矩阵转换成一副灰度图
    rgb2gray    将一副真彩色图像转换成灰度图像
    rgb2ind      将真彩色图像转换成索引色图像
   ----------------------------------------------------------------------------

4. 图像文件的读写和查询

4.1 图形图像文件的读取
   利用函数imread()可完成图形图像文件的读取,语法:

     A=imread(filename,fmt)
     [X,map]=imread(filename,fmt)
     [...]=imread(filename)
     [...]=imread(filename,idx) (只对TIF格式的文件)
     [...]=imread(filename,ref) (只对HDF格式的文件)

   通常,读取的大多数图像均为8bit,当这些图像加载到内存中时,Matlab就将其存放
在类uint8中。此为Matlab还支持16bit的PNG和TIF图像,当读取这类文件时,Matlab就将
其存贮在uint16中。

   注意:对于索引图像,即使图像阵列的本身为类uint8或类uint16,imread函数仍将
颜色映象表读取并存贮到一个双精度的浮点类型的阵列中。

4.2 图形图像文件的写入
   使用imwrite函数,语法如下:

   imwrite(A,filename,fmt)
   imwrite(X,map,filename,fmt)
   imwrite(...,filename)
   imwrite(...,parameter,value)

   当利用imwrite函数保存图像时,Matlab缺省的方式是将其简化道uint8的数据格式。

4.3 图形图像文件信息的查询   imfinfo()函数

5. 图像文件的显示

5.1 索引图像及其显示

   方法一:
          image(X)
          colormap(map)

   方法二: 
          imshow(X,map)

5.2 灰度图像及其显示
   Matlab 7.0 中,要显示一副灰度图像,可以调用函数 imshow 或 imagesc (即 
imagescale,图像缩放函数)

   (1) imshow 函数显示灰度图像
    使用 imshow(I)    或 使用明确指定的灰度级书目:imshow(I,32)
    
    由于Matlab自动对灰度图像进行标度以适合调色板的范围,因而可以使用自定义
大小的调色板。其调用格式如下:
           imshow(I,[low,high])
    其中,low 和 high 分别为数据数组的最小值和最大值。

   (2) imagesc 函数显示灰度图像
   下面的代码是具有两个输入参数的 imagesc 函数显示一副灰度图像
       imagesc(1,[0,1]);
       colormap(gray);
    imagesc 函数中的第二个参数确定灰度范围。灰度范围中的第一个值(通常是0),
对应于颜色映象表中的第一个值(颜色),第二个值(通常是1)则对应与颜色映象表
中的最后一个值(颜色)。灰度范围中间的值则线型对应与颜色映象表中剩余的值(颜色)。

    在调用 imagesc 函数时,若只使用一个参数,可以用任意灰度范围显示图像。在该
调用方式下,数据矩阵中的最小值对应于颜色映象表中的第一个颜色值,数据矩阵中的最大
值对应于颜色映象表中的最后一个颜色值。

5.3 RGB 图像及其显示
   (1) image(RGB) 
   不管RGB图像的类型是double浮点型,还是 uint8 或 uint16 无符号整数型,Matlab都
能通过 image 函数将其正确显示出来。

   RGB8 = uint8(round(RGB64×255)); % 将 double 浮点型转换为 uint8 无符号整型
   RGB64 = double(RGB8)/255;            % 将 uint8 无符号整型转换为 double 浮点型
   RGB16 = uint16(round(RGB64×65535)); % 将 double 浮点型转换为 uint16 无符号整型 
   RGB64 = double(RGB16)/65535;      % 将 uint16 无符号整型转换为 double 浮点型

   (2) imshow(RGB) 参数是一个 m×n×3 的数组

5.4 二进制图像及其显示

   (1) imshow(BW)
   在 Matlab 7.0 中,二进制图像是一个逻辑类,仅包括 0 和 1 两个数值。像素 0 显示
为黑色,像素 1 显示为白色。
   显示时,也可通过NOT(~)命令,对二进制图象进行取反,使数值 0 显示为白色;1 显示
为黑色。 
   例如: imshow(~BW)

   (2) 此外,还可以使用一个调色板显示一副二进制图像。如果图形是 uint8 数据类型,
则数值 0 显示为调色板的第一个颜色,数值 1 显示为第二个颜色。
   例如: imshow(BW,[1 0 0;0 0 1])   

5.5 直接从磁盘显示图像
   可使用一下命令直接进行图像文件的显示: 
        imshow filename
   其中,filename 为要显示的图像文件的文件名。

   如果图像是多帧的,那么 imshow 将仅显示第一帧。但需注意,在使用这种方式时,图像
数据没有保存在Matlab 7.0 工作平台。如果希望将图像装入工作台中,需使用 getimage 函
数,从当前的句柄图形图像对象中获取图像数据,
   命令形式为: rgb = getimage;

bwlabel 
功能: 
标注二进制图像中已连接的部分。 
L = bwlabel(BW,n) 
[L,num] = bwlabel(BW,n)

isbw 
功能: 
判断是否为二进制图像。 
语法: 
flag = isbw(A) 
相关命令: 
isind, isgray, isrgb 
74.isgray 
功能: 
判断是否为灰度图像。 
语法: 
flag = isgray(A) 
相关命令: 
isbw, isind, isrgb

11.bwselect 
功能: 
在二进制图像中选择对象。 
语法: 
BW2 = bwselect(BW1,c,r,n) 
BW2 = bwselect(BW1,n) 
[BW2,idx] = bwselect(...) 
举例 
BW1 = imread('text.tif'); 
c = [16 90 144]; 
r = [85 197 247]; 
BW2 = bwselect(BW1,c,r,4); 
imshow(BW1) 
figure, imshow(BW2)

47.im2bw 
功能: 
转换图像为二进制图像。 
语法: 
BW = im2bw(I,level) 
BW = im2bw(X,map,level) 
BW = im2bw(RGB,level) 
举例 
load trees 
BW = im2bw(X,map,0.4); 
imshow(X,map)

Matlab中如何读出写入图像文件以及对图像的简单处理

MATLAB图像处理工具箱支持四种基本图像类型:索引图像、灰度图像、二进制图像和RGB图像。MATLAB直接从图像文件中读取的图像为RGB 图像。它存储在三维数组中。这个三维数组有三个面,依次对应于红(Red)、绿(Green)、蓝(Blue)三种颜色,而面中的数据则分别是这三种颜色 的强度值,面中的元素对应于图像中的像素点。设所得矩阵为X三维矩阵(256,256,3) ,X(:,:,1)代表红颜色的2维矩阵 X(:,:,2)代表绿颜色的2维矩阵, X(:,:,3)代表兰颜色的2维矩阵。[X, map]=imread('34.bmp');r=double(X(:,:,1)); %r是256 x 256的红色信息矩阵g=double(X(:,:,2)); %g是256 x 256的绿色信息矩阵b=double(X(:,:,3)); %b是256 x 256的兰色信息矩阵
索引图像数据包括图像矩阵X与颜色图数组map,其中颜色图map是按图像中颜色值进行排序后的数组。对于每个像素,图像矩阵X包含一个值,这个值就是颜 色图数组map中的索引。颜色图map为m×3双精度矩阵,各行分别指定红、绿、蓝(R、G、B)单色值,map=[RGB],R、G、B为值域为 [0,1]的实数值,m为索引图像包含的像素个数。

对于相同的数据,采用uint8格式比双精度格式节省内存空间,从而更经济。在MATLAB中
如果索引图像的颜色图小于256行,则它的图像矩阵以uint8格式存储,否则以双精度格式存储。
一:imread:从图像文件夹中读取图像
A = imread(FILENAME,FMT) 读取图像到A,如果文件是包含一灰度图像,A是一二维矩阵,如果文件是包含一真彩色图像(RGB),A是一三维矩阵(M-by-N-by-3)。FILENAME :图像文件名;FMT:图像文件格式;
文件必须在当前目录下,或在Matlab的一路径上。如果 imread不能够找到一名称为FILENAME的文件,那么它将找一名为FILENAME.FMT的文件
[X,MAP] = imread(FILENAME,FMT) 把图像FILENAME读入与它相关的图像色彩信息写入MAP,图像色彩信息值在范围[0,1]中自动地重新调整. 
[...] = imread(FILENAME)这种方式是试图得到文件的格式从文件所包含的信息。 
    [...] = imread(URL,...)从一Internet URL上读图像   URL 必须包含协议(即: "http://").
1.2数据类型:
    TIFF的特殊语法:
    [...] = imread(...,IDX) 从很多图像TIFF文件中 读一个图像;IDX是一个整数值,它显示了所读图像在文件中的顺序,例如:如果 IDX是 3, imread将读文件中的第三个图像。 如果省略了这个变量, imread将读文件中的第一个图像. 
     IMREAD支持的图像文件格式:JPEG TIFF GIF   BMP PNG HDF   PCX    XWD    ICO    CUR    RAS PBM   PGM   PPM 
相关信息也可在Matlab中查看: imfinfo, imwrite, imformats, fread,
二:imwrite输出图像
imwrite(A,FILENAME,FMT) 把图像 A 写入图像文件 FILENAME.
imwrite(X,MAP,FILENAME,FMT) 把 X和它的相关色彩信息MAP写入FILENAME. 
imwrite(...,FILENAME) 把图像 写入图像文件FILENAME,并推测可能的格式用来做filename的扩展名。扩展名必须是FMT中一合法名.
imwrite(...,PARAM1,VAL1,PARAM2,VAL2,...) 不同的参数控制输出文件的各种不同特征。参数要是当前所支持的HDF,JPEG, TIFF, PNG, PBM, PGM, 和PPM 文件
三:image 显示图像.image(C) 把矩阵 C 转成一图像. C 可以是一MxN 或 MxNx3维的矩阵,且可以是包含 double, uint8,或 uint16 数据.image是用来显示附标图像,即显示的图像上有x,y坐标轴的显示,可以看到图像的像素大小。但可以加上axis off命令即可把坐标去掉。
imshow只是显示图像。用colormap来定义图像显示用的颜色查找表,比如用colormap(pink),可以把黑白图像显示成带粉红色的图像。
图像像素矩阵的数据类型:(1)显示真彩色图像像素三维矩阵X,如果是uint8类型,要求矩阵的数据范围为0-255,(2)如果是double型,则其数据范围为0-1,要不就会出错或者出现空白页。
类型转换:(1)如果你原来的数值是uint8,在运算中转换为double后,实际要显示的数值没有改变的话,只要 用uint8(X)就可转换为uint8型,如果不想转换频繁,也可在显示时用X/255来转换为符合0-1double类型范围要求的数值显示。(2) 如果显示索引图像(二维矩阵),如果索引图像像素数值是double型,则它的取值范围为1-length(colormap),数值起点为1,则矩阵中 数值为1的对应colormap中第一行数据,如果索引图像像素数值是uint8,则取值范围为0-255,数值起点为0,则矩阵中数值为0的对应 colormap中第一行数据,所以索引图像这两个数据类型之间的转换,要考虑到+1或-1。直接用uint8或double转换则会查找移位,产生失真 情况。uint16数据类型与uint8类似,取值范围为0-65536。
四:其它常用图像操作:
图像显示于屏幕有imshow( ), image( )函数;
图像进行裁剪imcrop( );
图像的插值缩放imresize( )函数实现;
旋转用 imrotate( )实现。

2011-09-20 22:04:16 phoenixwsl 阅读数 11223

这是数字图像处理的第二次作业,包含的内容很多,有图像的二值化 膨胀 腐蚀 以及图像的开闭操作 击中击不中变换等。

1、图像的二值化

难点在于如何选取合适的Threshold。

基本思想:将二值化得到的二值图像视为两部分,一部分对应前景(Foreground),另一部分对应背景(Background)。尝试找到一个合适的threshold使得到的前景和背景的内部方差最小,而它们之间的方差则最大。


用上面一个很简单的式子就可以求出最优化的阈值 我用matlab实现了,C的可以参考下面的链接,很简单,不妨一试。

http://zhidao.baidu.com/question/217377206.html

当然还有更好的方法 可以上网搜搜相关的论文 还是挺多的 人民的智慧还是无穷滴\(^o^)/~


2 图像的膨胀和腐蚀 【B是结构元】

膨胀(dilate):由B对A膨胀所产生的二值图象D是满足以下条件的点(x,y)的集合:如果B的中心原点平移到点(x,y),那么它与A的交集非空

腐蚀(erode):由B对A腐蚀所产生的二值图象E是满足以下条件的点(x,y)的集合:如果B的中心原点平移到点(x,y),那么B将完全包含于A中

A-B A被B腐蚀 

A+B A被B膨胀 

A -B的补集 等于 A的补集被B膨胀

A+B的补集 等于 A的补集被B腐蚀

膨胀和腐蚀 是对偶的关系

*腐蚀和膨胀的应用:边界提取(Boundary Extraction)

3、图像的开运算和闭运算

开运算:先腐蚀 后膨胀


用来消除小物体 在纤细点处分离物体,平滑较大的物体的边界 同时不明显的改变其面积

闭运算:先膨胀 后腐蚀


用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。

4、击中或击不中变换(Hit-or miss transformation, HMT)

我的理解就是一个完全的模板匹配过程。

击中:找出满足的前景 

击不中:找出满足的背景

两者的交集就是一个完全的模板匹配过程。#

HMT是形态学运算推广到更为一般的情况,这时结构元不仅含有物体(前景)点,而且还含有背景点,只有当结构元素与所对应的区域完全符合时才作为结果输出到输出图象。实际上就演变为条件严格的模板匹配。

*HMT的应用

图像的Thining:

图像的细化 一般是指二值图像的骨骼化

在进行thinning操作的时候,首先从物体的边界上取一小块,然后用其做HMT,去掉HMT选择出来的点,

依此类推,经过一系列的HMT和删减之后,我们就能够对整个物体做thinning


end

Matlab图像二值化

阅读数 34269

数据特征的选取

阅读数 12137

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