http://blog.csdn.net/vicdd/article/details/52647906
1、img[i,j,c]
i表示图片的行数,j表示图片的列数,c表示图片的通道数(RGB三通道分别对应0,1,2)。坐标是从左上角开始
灰度图片访问方式为:
gray[i,j]
2、生成椒盐噪声
from skimage import io,data
import numpy as np
img=data.chelsea()
#随机生成5000个椒盐
rows,cols,dims=img.shape
for i in range(5000):
x=np.random.randint(0,rows)
y=np.random.randint(0,cols)
img[x,y,:]=255
io.imshow(img)
io.show()
这里用到了numpy包里的random来生成随机数,randint(0,cols)表示随机生成一个整数,范围在0到cols之间
3、图像数据类型转换
Function name | Description |
---|---|
img_as_float | Convert to 64-bit floating point. |
img_as_ubyte | Convert to 8-bit uint. |
img_as_uint | Convert to 16-bit uint. |
img_as_int | Convert to 16-bit int. |
常用的颜色空间有灰度空间、rgb空间、hsv空间和cmyk空间。颜色空间转换以后,图片类型都变成了float型。
所有的颜色空间转换函数,都放在skimage的color模块内。
skimage.color.convert_colorspace(arr, fromspace, tospace)
表示将arr从fromspace颜色空间转换到tospace颜色空间。
例:rgb转hsv
hsv=color.convert_colorspace(img,'RGB','HSV')
5、图像绘制
imshow()函数格式为:
matplotlib.pyplot.
imshow
(X, cmap=None)
X: 要绘制的图像或数组。
cmap: 颜色图谱(colormap), 默认绘制为RGB(A)颜色空间。
其它可选的颜色图谱如下列表:
plt.imshow(img,cmap=plt.cm.jet)plt.imshow(img[:,:,0],plt.cm.gray) #绘制第二幅图片,且为灰度图 R分量变为灰度
在图片绘制过程中,我们用matplotlib.pyplot模块下的figure()函数来创建显示窗口,该函数的格式为:
matplotlib.pyplot.
figure
(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None)
所有参数都是可选的,都有默认值,因此调用该函数时可以不带任何参数,其中:
num: 整型或字符型都可以。如果设置为整型,则该整型数字表示窗口的序号。如果设置为字符型,则该字符串表示窗口的名称。用该参数来命名窗口,如果两个窗口序号或名相同,则后一个窗口会覆盖前一个窗口。
figsize: 设置窗口大小。是一个tuple型的整数,如figsize=(8,8)
dpi: 整形数字,表示窗口的分辨率。
facecolor: 窗口的背景颜色。
edgecolor: 窗口的边框颜色。
还有几个常用函数:
ravel | 为每个子图设置变量 | ax0,ax1,ax2,ax3=axes.ravel() |
set_title | 设置子图标题(与axes结合使用) | ax0.set_title('first window') |
tight_layout | 自动调整子图显示布局 | plt.tight_layout() |
skimage.io.
ImageCollection
(load_pattern,load_func=None)
这个函数是放在io模块内的,带两个参数,第一个参数load_pattern, 表示图片组的路径,可以是一个str字符串。第二个参数load_func是一个回调函数,我们对图片进行批量处理就可以通过这个回调函数实现。回调函数默认为imread(),即默认这个函数是批量读取图片。
import skimage.io as io from skimage import data_dir str=data_dir + '/*.png' coll = io.ImageCollection(str) print(len(coll)) #得到图片集合以后,我们还可以将这些图片连接起来,构成一个维度更高的数组,连接图片的函数为:7、图像修改skimage.io.concatenate_images(ic)
(1)改变图片尺寸resize
函数格式为:
skimage.transform.resize(image, output_shape)
image: 需要改变尺寸的图片
output_shape: 新的图片尺寸 eg:(80×80)
(2)按比例缩放rescale
函数格式为:
skimage.transform.rescale(image, scale[, ...])
scale参数可以是单个float数,表示缩放的倍数,也可以是一个float型的tuple,如[0.2,0.5],表示将行列数分开进行缩放
print(transform.rescale(img, 0.1).shape) #缩小为原来图片大小的0.1倍 print(transform.rescale(img, [0.5,0.25]).shape) #缩小为原来图片行数一半,列数四分之一(3)金字塔
skimage.transform.pyramid_gaussian(image, downscale=2)
downscale控制着金字塔的缩放比例http://write.blog.csdn.net/postedit
8、对比度及亮度
(1)gamma
函数格式为:skimage.exposure.adjust_gamma(image, gamma=1)
如果gamma>1, 新图像比原图像暗
如果gamma<1,新图像比原图像亮
gam1= exposure.adjust_gamma(image, 2) #调暗
(2)log
gam1= exposure.adjust_log(image) #对数调整(3)判断图像对比度是否偏低
函数:is_low_contrast(img)
返回一个bool型值
from skimage import data, exposure image =data.moon() result=exposure.is_low_contrast(image) print(result)
输出为False
(4)调整强度函数:skimage.exposure.rescale_intensity(image, in_range='image', out_range='dtype')
in_range 表示输入图片的强度范围,默认为'image', 表示用图像的最大/最小像素值作为范围
out_range 表示输出图片的强度范围,默认为'dype', 表示用图像的类型的最大/最小值作为范围
默认情况下,输入图片的[min,max]范围被拉伸到[dtype.min, dtype.max],如果dtype=uint8, 那么dtype.min=0, dtype.max=255
import numpy as np from skimage import exposure image = np.array([51, 102, 153], dtype=np.uint8) mat=exposure.rescale_intensity(image) print(mat)
输出为[ 0 127 255]
如果原始像素值不想被拉伸,只是等比例缩小,就使用in_range参数,如:
import numpy as np from skimage import exposure image = np.array([51, 102, 153], dtype=np.uint8) tmp=image*1.0 mat=exposure.rescale_intensity(tmp,in_range=(0,255)) print(mat)
输出为:[ 0.2 0.4 0.6],即原像素值除以255
9、直方图的绘制
(1)计算直方图函数:skimage.exposure.histogram(image, nbins=256)
在numpy包中,也提供了一个计算直方图的函数histogram(),两者大同小义。
返回一个tuple(hist, bins_center), 前一个数组是直方图的统计量,后一个数组是每个bin的中间值
(2)绘制直方图hist函数:
n, bins, patches = plt.hist(arr, bins=10, normed=0, facecolor='black', edgecolor='black',alpha=1,histtype='bar')
hist的参数非常多,但常用的就这六个,只有第一个是必须的,后面四个可选
arr: 需要计算直方图的一维数组
bins: 直方图的柱数,可选项,默认为10
normed: 是否将得到的直方图向量归一化。默认为0
facecolor: 直方图颜色
edgecolor: 直方图边框颜色
alpha: 透明度
histtype: 直方图类型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’
返回值 :
n: 直方图向量,是否归一化由参数normed设定
bins: 返回各个bin的区间范围
patches: 返回每个bin里面包含的数据,是一个list
当图像集中在某一像素值附近时,可以均衡化图像:
img1=exposure.equalize_hist(img) arr1=img1.flatten() plt.subplot(223) plt.imshow(img1,plt.cm.gray) #均衡化图像10、滤波
(1)sobel算子
sobel算子可用来检测边缘
函数格式为:skimage.filters.sobel(image, mask=None)
roberts,scharr,prewitt也是这种形式。
函数格式:skimage.feature.canny(image,sigma=1.0) sigma越小,边缘线条越细小。
(3)gabor滤波
gabor滤波可用来进行边缘检测和纹理特征提取。
函数调用格式:skimage.filters.gabor_filter(image, frequency)
通过修改frequency值来调整滤波效果,返回一对边缘结果,一个是用真实滤波核的滤波结果,一个是想象的滤波核的滤波结果。
filt_real, filt_imag = filters.gabor_filter(img,frequency=0.6)frequency越大,图像越精细。
(4)gaussian滤波
多维的滤波器,是一种平滑滤波,可以消除高斯噪声。
调用函数为:skimage.filters.gaussian_filter(image, sigma)
通过调节sigma的值来调整滤波效果
sigma越大,过滤后的图像越模糊
(5)median
中值滤波,一种平滑滤波,可以消除噪声。
需要用skimage.morphology模块来设置滤波器的形状。
from skimage.morphology import disk
edges1 = filters.median(img,disk(5))disk()里面的数值越大,滤波器越大,图像越模糊。
(6)水平、垂直边缘检测
上边所举的例子都是进行全部边缘检测,有些时候我们只需要检测水平边缘,或垂直边缘,就可用下面的方法。
水平边缘检测:sobel_h, prewitt_h, scharr_h
垂直边缘检测: sobel_v, prewitt_v, scharr_v
edges1 = filters.sobel_h(img)(7)交叉边缘检测
可使用Roberts的十字交叉核来进行过滤,以达到检测交叉边缘的目的。这些交叉边缘实际上是梯度在某个方向上的一个分量。
其中一个核:
0 1 -1 0
对应的函数:
roberts_neg_diag(image)
dst =filters.roberts_neg_diag(img)
另外一个核:
1 0 0 -1
对应函数为:
roberts_pos_diag(image)