Python一些基本的图像操作和处理总结

一、Python图像处理PIL库

1.1 转换图像格式

# PIL(Python Imaging Library)
from PIL import Image
plt.rcParams['font.sans-serif'] = ['SimHei']
# 读取的是图像,cv.imread读取的是array,Image.open()显示的图像是RGB
pil_im=Image.open('pic/kobe_mamba.jpg')

subplot(121),plt.title('原图'),axis('off')
imshow(pil_im)

pil_im_gray=pil_im.convert('L')
subplot(122),plt.title('灰度图'),xticks(x,()),yticks(y,())
imshow(pil_im_gray)

# 转换图像格式 PIL中有九种不同模式。分别为1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
plt.rcParams['font.sans-serif'] = ['SimHei']

pil_im=Image.open('pic/apple.jpg')

# 模式1 二值图像

pil_im_binary=pil_im.convert('1')
subplot(231),plt.title('二值图像'),axis('off'),imshow(pil_im_binary)

pil_im_binary.getpixel((10,10))

# 模式2 L = R * 299/1000 + G * 587/1000+ B * 114/1000 灰度模式 0表示黑,255表示白

# 模式3 P模式为8位彩色图像,通过RGB调色

pil_im_p=pil_im.convert('P')

subplot(232),plt.title('调色P图像'),axis('off'),imshow(pil_im_p)

# 模式4 模式“RGBA”为32位彩色图像,它的每个像素用32个bit表示,其中24bit表示红色、绿色和蓝色三个通道,另外8bit(255)表示alpha通道,255表示不透明。

pil_im_RGBA=pil_im.convert('RGBA')

subplot(233),plt.title('RGBA图像'),axis('off'),imshow(pil_im_RGBA)

# 模式5 CMYK 三原色+黑色,每个像素由32位表示
# C = 255 - R, M = 255 - G, Y = 255 - B, K = 0

pil_im_CMYK=pil_im.convert('CMYK')

subplot(234),plt.title('CMYK图像'),axis('off'),imshow(pil_im_CMYK)

#模式6 YCbcr 24位bit表示 Y= 0.257*R+0.504*G+0.098*B+16 Cb = -0.148*R-0.291*G+0.439*B+128 Cr = 0.439*R-0.368*G-0.071*B+128

pil_im_YCbCr=pil_im.convert('YCbCr')

subplot(235),plt.title('YCbCr图像'),axis('off'),imshow(pil_im_YCbCr)

# 模式7 I模式略 与L模式显示相同 ,只不过是32bit

# 模式8 F模式略 像素保留小数,其余与L模式相同

1.2 缩略图

# PIL(Python Imaging Library)
from PIL import Image
from pylab import *
plt.rcParams['font.sans-serif'] = ['SimHei']

pil_im=Image.open('pic/kobe_mamba.jpg')

# 创建缩略图 且可以指定大小

pil_im.thumbnail((120,120))

plt.title('缩略图'),xticks(x,()),yticks([])
imshow(pil_im)

1.3 复制、粘贴和旋转、调整尺寸

# 元组坐标分别为(左、上、右、下),从而标出了一块区域,相当于[100:400,100:400]

box=(100,100,400,400)

region=pil_im.crop(box)
# 旋转180度
region=region.transpose(Image.ROTATE_180)

figure(figsize=(5,5))

plt.title('复制区域'),axis('off')

imshow(region)
#粘贴

pil_im=Image.open('pic/kobe_mamba.jpg')

pil_im.paste(region,box)

figure(figsize=(5,5))

plt.title('粘贴后的图像'),axis('off')

imshow(pil_im)

# 调整尺寸和旋转 resize 和 rotate 函数

out=pil_im.resize((128,128))

out=pil_im.rotate(45)

第二张图是box旋转了180度再粘贴的结果

二、Matoplotlib库基础学习

# 基本绘图
import numpy as np
import matplotlib.pyplot as plt
from numpy import pi
from pylab import *

x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
figure()
plt.plot(x,y)
figure()
plt.plot(x,z)
plt.show()

两张绘图



x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
plt.plot(x,y)
plt.plot(x,z)

绘图叠加

# 曲线颜色、标记、粗细
plot(x, y, color="blue", linewidth=1.0, linestyle=":")
plot(x,z,'--r',linewidth=2.0)


# 离散取值
a=np.arange(13)*pi/12
b=cos(3*a)
plot(a,b,'bo',markersize=3)

# 离散取值的属性及用虚线相连
a=np.arange(13)*pi/12
b=cos(3*a)
plot(a,b,'--rs',markeredgecolor='y',markerfacecolor='w')

# 设置坐标轴的范围和记号
x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
xlim(-4,4)
xticks(np.linspace(-4,4,10))
ylim(-1.0,1.0)
yticks(np.linspace(-1.0,1.0,5))
plt.plot(x,y,'--r')

# 设置title与坐标轴的一些操作
# 设置中文
matplotlib.rcParams['axes.unicode_minus'] =False
plt.rcParams['font.sans-serif'] = ['SimHei']
x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
figure()
plt.plot(x,y)
axis('off')

figure()
plt.plot(x,z)
plt.xticks([])

plt.show()
# 设置title与坐标轴的一些操作
# 设置中文
matplotlib.rcParams['axes.unicode_minus'] =False
plt.rcParams['font.sans-serif'] = ['SimHei']
x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
figure()
plt.plot(x,y)
axis('off')

figure()
plt.plot(x,z)
plt.xticks([])

plt.show()

#设置坐标轴的标签(多样化)
# xticks(locs, [labels], **kwargs)  # Set locations and labels **kwargs是关键字参数
import calendar

x = range(1,13,1)
y = range(1,13,1)
plt.plot(x,y)
# 标签手动设置('','','',...)亦可
plt.xticks(x, calendar.month_name[1:13],color='m',rotation=45,fontsize=12,fontname='Arial')
plt.show()

# 设置图例
matplotlib.rcParams['axes.unicode_minus'] =False

plt.rcParams['font.sans-serif'] = ['SimHei']
a=np.arange(13)*pi/12
b=cos(3*a)
plt.plot(a,b,'--rs',markeredgecolor='y',markerfacecolor='w',label='cos的图像')
xlabel('横轴')
ylabel('纵轴')
plt.legend(loc='upper right')
plt.show()

# 子图1
matplotlib.rcParams['axes.unicode_minus'] =False

x=np.linspace(-pi,pi,10)
y,z=np.cos(x),np.sin(x)
fig, (ax1 ,ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8, 4))
ax1.plot(x,y),ax2.plot(x,z)
ax1.set_title('cos'),ax2.set_title('sin')
plt.show()

# 子图2
matplotlib.rcParams['axes.unicode_minus'] =False

x=np.linspace(-pi,pi,10)
y,z=np.cos(x),np.sin(x)
figure(figsize=(10,5),dpi=80)
subplot(121),plt.plot(x,y),plt.title('cos')
subplot(122),plt.plot(x,z),plt.title('sin')
plt.show()

2.1 绘制实际图像中的点和线

# 使用matplotlib连线
from PIL import Image
from pylab import *

# 读取为列表,以便标记x、y的点?
im=array(Image.open('pic/kobe_mamba.jpg'))

imshow(im)

# 列表 包含四个点坐标
x=[100,100,400,400]
y=[200,500,200,500]

#红色叉型标出
plot(x,y,'rx')

# 连接坐标的前两个点的线 (100,200)与(100,500)
plot(x[:2],y[:2])

show()

2.2 图像轮廓与直方图

# contour 与 hist
# 绘制轮廓要将图像先灰度化
from PIL import Image
from pylab import *

im=array(Image.open('pic/kobe_mamba.jpg').convert('L'))
figure()
#
gray()
# 绘制轮廓,且起始位置从左上角开始
contour(im,origin='image')

# 坐标轴均匀分布
axis('equal')

# 新图像
figure()
hist(im.ravel(),256)

# hist的第二个参数指定小区间的个数,128个,即每个小区间灰度值跨度为2
figure()
hist(im.flatten(),128) 

show()

三、Numpy库基本学习

import numpy as np

import math
a=np.array(((1,2,3),(4,5,6)),dtype=float/complex)
a


b=np.arange(15).reshape(3,5)
b
# 属性
b.shape
b.ndim
b.dtype
b.size
b.itemsize

from numpy import pi
np.linspace( 0, 2, 9 )                 # 9 numbers from 0 to 2
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
c=np.random.random((2,3))

c.max/min()

d=np.arange(12).reshape((3,4))
d.dtype.name
# 每个col的sum
print(d.sum(axis=0))
# 每行的累计和
print(d.cumsum(axis=1))

# 转变数组类型
a=np.array(((1,2,3),(4,5,6)),'float32')
a=a.astype('int16')
a

# 索引和切片
a = np.arange(10)**3 # 0~9的立方
a[2:5] #a[2-4]
# 令a[0,2,4]为-1000
a[:6:2] = -1000
# reverse
a[ : :-1] 

a = np.arange(12).reshape((3,4))
a[0:3,1]
# 第2列
# or
a[:,1]
a[0:1,0:3]

# 变换为1维数组
a = np.arange(12).reshape((3,4))
a.ravel()

# 变换形状
a = np.arange(12).reshape((3,4))
a.resize((6,2))
a

a = np.arange(12).reshape((3,4))
b=10*np.random.random((3,4))
# 竖着叠加
np.vstack((a,b))
# 横着叠加
np.hstack((a,b))

x, y = np.ogrid[:3, :4]
# 同样可以设置步长
x, y = np.ogrid[0:3:1, 0:5:2]

# 询问,x>0的部分不变,其余赋值为2
np.where(x>0,x,2)

3.1 直方图均衡化

# 解释累加函数
import numpy as np
a=[1,2,3,4,5,6,7]
cdf=np.cumsum(a)

cdf[-1]

cdf=7*cdf/cdf[-1]
cdf

28

# 直方图均衡化
# bins 小区间的个数
def histeq(im,bins=256):
    #返回两个参数
    imhist,bins=histogram(im.flatten(),bins)
    # 累计分布函数,相当于cdf是一个列表
    cdf=imhist.cumsum()
    # cdf[-1]是列表的最后一个值,(0,255)
    cdf=255*cdf/cdf[-1]
    # 新的线性插值
    im2=interp(im.flatten(),bins[:-1],cdf)
    # 返回im2图像大小与im相同
    return im2.reshape(im.shape),cdf
# 直方图先转为灰度图
im=array(Image.open('pic/kobe_mamba.jpg').convert('L'))
im2,cdf=histeq(im,256)

figure()
imshow(im2)
figure()
hist(im2.flatten(),256)
show()

3.2 图像缩放

#  转换为array
img = np.asarray(image)

# 转换为Image
Image.fromarray(np.uint8(img))

# 图像缩放函数

def imresize(im,sz):
    # 将数组转换为图像
    pil_im=Image.fromarray(np.uint8(im))
    # 图像转换为数组
    return np.array(pil_im.resize(sz))

imshow(imresize(Image.open('pic/kobe_mamba.jpg'),(128,128)))

3.3 图像的主成分分析(PCA)

PCA(Principal Component Analysis,主成分分析)是一个非常有用的降维技巧。它可以在使用尽可能少维数的前提下,尽量多地保持训练数据的信息,在此意义上是一个最佳技巧。即使是一幅 100×100 像素的小灰度图像,也有 10 000 维,可以看成 10 000 维空间中的一个点。一兆像素的图像具有百万维。由于图像具有很高的维数,在许多计算机视觉应用中,我们经常使用降维操作。PCA 产生的投影矩阵可以被视为将原始坐标变换到现有的坐标系,坐标系中的各个坐标按照重要性递减排列。

为了对图像数据进行 PCA 变换,图像需要转换成一维向量表示。我们可以使用 NumPy 类库中的flatten() 方法进行变换。
将变平的图像堆积起来,我们可以得到一个矩阵,矩阵的一行表示一幅图像。在计算主方向之前,所有的行图像按照平均图像进行了中心化。我们通常使用 SVD(Singular Value Decomposition,奇异值分解)方法来计算主成分;但当矩阵的维数很大时,SVD 的计算非常慢,所以此时通常不使用 SVD 分解。

from PIL import Image
from numpy import *

def pca(X):
  """ 主成分分析:
    输入:矩阵X ,其中该矩阵中存储训练数据,每一行为一条训练数据
    返回:投影矩阵(按照维度的重要性排序)、方差和均值"""

  # 获取维数
    num_data,dim = X.shape

  # 数据中心化
    mean_X = X.mean(axis=0)
    X = X - mean_X

if dim>num_data:
  # PCA- 使用紧致技巧
  M = dot(X,X.T) # 协方差矩阵
  e,EV = linalg.eigh(M) # 特征值和特征向量
  tmp = dot(X.T,EV).T # 这就是紧致技巧
  V = tmp[::-1] # 由于最后的特征向量是我们所需要的,所以需要将其逆转
  S = sqrt(e)[::-1] # 由于特征值是按照递增顺序排列的,所以需要将其逆转
  for i in range(V.shape[1]):
    V[:,i] /= S
else:
  # PCA- 使用SVD 方法
  U,S,V = linalg.svd(X)
  V = V[:num_data] # 仅仅返回前nun_data 维的数据才合理

# 返回投影矩阵、方差和均值
return V,S,mean_X

四、Scipy

4.1 图像模糊

# 图像模糊
# Scipy 库
from PIL import Image
from numpy import *
from scipy.ndimage import filters

im=array(Image.open('pic/building.tif').convert('L'))
# filters.gaussian_filter第二个参数是标准差
im2=filters.gaussian_filter(im,9)
imshow(im2)

from PIL import Image
# 彩色通道,三通道分别进行高斯滤波
im=array(Image.open('pic/landmark500x500.jpg'))
im2=np.zeros((im.shape))
for i in arange(3):
    im2[:,:,i]=filters.gaussian_filter(im[:,:,i],2)

# 转换为(0,255),否则imshow显示不出来
im2=uint8(im2)
figure(figsize=(5,5),dpi=80)
imshow(im2)
axis('off')

4.2 图像导数

from PIL import Image
from numpy import *
from scipy.ndimage import filters

# filters.sobel(src,0/1,dst),0表示y方向的方向导数,1表示x方向的方向导数

figure()
im=array(Image.open('pic/building.tif'))
imshow(im)

imx=np.zeros(im.shape)

imy=np.zeros(im.shape)
filters.sobel(im,0,imy)
figure()
imx=uint8(imy)
imshow(imy)

figure()
filters.sobel(im,1,imx)
imy=uint8(imx)
imshow(imx)

figure()
mag=sqrt(imx**2+imy**2)
mag=uint8(mag)
imshow(mag)

show()

第二/三张图是sobel算子在x/y方向的导数,第四张图是两个导数叠加成梯度。

4.3 形态学计数

# 形态学 对象计数
from scipy.ndimage import measurements,morphology

im=array(Image.open('pic/zhiwen.tif').convert('L'))
im2=np.zeros(im.shape)
im2=1*(im<128)

labels,nbr_objects=measurements.label(im2)

print(f"Number of objects is {nbr_objects}.")

labels=np.uint8(labels)
imshow(labels)

im_open=morphology.binary_opening(im2,ones((3,3)),1)
labels_open,nbr_objects_open=measurements.label(im_open)
print(f"Number of objects is {nbr_objects_open}.")

imshow(labels_open)


形态学计数使用label()函数,令图像的灰度值为标签,图一找到了114个物体,图二经过开操作,找到了17个物体。

到此这篇关于Python一些基本的图像操作和处理总结的文章就介绍到这了,更多相关Python图像操作和处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python用Pillow(PIL)进行简单的图像操作方法

    Python用Pillow(PIL)进行简单的图像操作方法 颜色与RGBA值 计算机通常将图像表示为RGB值,或者再加上alpha值(通透度,透明度),称为RGBA值.在Pillow中,RGBA的值表示为由4个整数组成的元组,分别是R.G.B.A.整数的范围0~255.RGB全0就可以表示黑色,全255代表黑色.可以猜测(255, 0, 0, 255)代表红色,因为R分量最大,G.B分量为0,所以呈现出来是红色.但是当alpha值为0时,无论是什么颜色,该颜色都不可见,可以理解为透明. from

  • 2021年最新用于图像处理的Python库总结

    一.OpenCV OpenCV是最著名和应用最广泛的开源库之一,用于图像处理.目标检测.人脸检测.图像分割.人脸识别等计算机视觉任务.除此之外,它还可以用于机器学习任务. 这是英特尔在2002年开发的.它是用C++编写的,但是开发人员已经提供了Python和java绑定.它易于阅读和使用. 为了建立计算机视觉和机器学习模型,OpenCV有超过2500种算法.这些算法对于执行各种任务非常有用,例如人脸识别.目标检测等.让我们看一些可以使用OpenCV执行的示例: 灰度缩放 灰度缩放是一种将3通道图

  • Python图像处理之膨胀与腐蚀的操作

    引言 膨胀与腐蚀是图像处理中两种最基本的形态学操作,膨胀将目标点融合到背景中,向外部扩展,腐蚀与膨胀意义相反,消除连通的边界,使边界向内收缩.在本文中我们将了解使用内核的图像膨胀与腐蚀的基本原理. 让我们开始吧,同样我们需要导入必需的库. import numpy as np import matplotlib.pyplot as plt from skimage.io import imread, imshow from skimage.draw import circle from skim

  • python图像处理基本操作总结(PIL库、Matplotlib及Numpy)

    一.PIL库对图像的基本操作 1.读取图片 PIL网上有很多介绍,这里不再讲解.直接操作,读取一张图片,将其转换为灰度图像,并打印出来. from PIL import Image import matplotlib.pyplot as plt pil_im = Image.open("empire.jpeg") pil_image = pil_im.convert("L") plt.gray() plt.imshow(pil_image) plt.show() 输

  • python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)

    图像素描特效 图像素描特效主要经过以下几个步骤: 调用cv.cvtColor()函数将彩色图像灰度化处理: 通过cv.GaussianBlur()函数实现高斯滤波降噪: 边缘检测采用Canny算子实现: 最后通过cv.threshold()反二进制阈值化处理实现素描特效. #coding:utf-8 import cv2 as cv import numpy as np #读取原始图像 img = cv.imread('d:/paojie.png') #图像灰度处理 gray = cv.cvtC

  • 使用Python给头像戴上圣诞帽的图像操作过程解析

    前言 随着圣诞的到来,大家纷纷@官方微信给自己的头像加上一顶圣诞帽.当然这种事情用很多P图软件都可以做到.但是作为一个学习图像处理的技术人,还是觉得我们有必要写一个程序来做这件事情.而且这完全可以作为一个练手的小项目,工作量不大,而且很有意思. 用到的工具 OpenCV(毕竟我们主要的内容就是OpenCV...) dlib(dlib的人脸检测比OpenCV更好用,而且dlib有OpenCV没有的关键点检测.) 用到的语言为Python.但是完全可以改成C++版本,时间有限,就不写了.有兴趣的小伙

  • Python一些基本的图像操作和处理总结

    一.Python图像处理PIL库 1.1 转换图像格式 # PIL(Python Imaging Library) from PIL import Image plt.rcParams['font.sans-serif'] = ['SimHei'] # 读取的是图像,cv.imread读取的是array,Image.open()显示的图像是RGB pil_im=Image.open('pic/kobe_mamba.jpg') subplot(121),plt.title('原图'),axis('

  • python使用opencv resize图像不进行插值的操作

    如下所示: def resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None): 如果使用vanilla resize,不改变默认参数,就会对原图像进行插值操作.不关你是扩大还是缩小图片,都会通过插值产生新的像素值. 对于语义分割,target的处理,如果是对他进行resize操作的话.就希望不产生新的像素值,因为他的颜色信息,代表了像素的类别信息. 但是我们有时候希望resize之后不产生新的像素值,而是产生利用最近邻点

  • 详解Python+OpenCV进行基础的图像操作

    目录 介绍 形态变换 腐蚀 膨胀 创建边框 强度变换 对数变换 线性变换 去噪彩色图像 使用直方图分析图像 介绍 众所周知,OpenCV是一个用于计算机视觉和图像操作的免费开源库. OpenCV 是用 C++ 编写的,并且有数千种优化的算法和函数用于各种图像操作.很多现实生活中的操作都可以使用 OpenCV 来解决.例如视频和图像分析.实时计算机视觉.对象检测.镜头分析等. 许多公司.研究人员和开发人员为 OpenCV 的创建做出了贡献.使用OpenCV 很简单,而且 OpenCV 配备了许多工

  • Python OpenCV超详细讲解调整大小与图像操作的实现

    目录 准备工作 重新调整图像大小 图像裁剪 准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库. 我们还要知道在OpenCV中,坐标轴的方向是x轴向右,y轴向下,坐标原点在左上角,比如下面这张长为640像素,宽为480像素的图片.OK,下面开始本节的学习吧. 查看图像大小 调用imread()方法获取我们资源文件夹中的图片lambo.png 输出图像的shape属性 img=cv2.imread("Resources/lam

  • 2014年10个最佳的PHP图像操作库

    Thomas Boutell 以及众多的开发者创造了以GD图形库闻名的一个图形软件库,用于动态的图形计算. GD提供了对于诸如C, Perl, Python, PHP, OCaml等等诸多编程语言的支持. 除了生成HTML输出之外, 你还可以使用php以众多的像 PNG, JPEG, GIF, WBMP,以及 XPM这样的图形文件格式来创建和计算图形文件. 并且,php的使用还能让你可以直接向一个浏览器输出图像流. 为了做到这一点,你需要借助于GD库图像功能的使用来编译php. 在这篇文章中,你

  • Python数据报表之Excel操作模块用法分析

    本文实例讲述了Python数据报表之Excel操作模块用法.分享给大家供大家参考,具体如下: 一 点睛 Excel是当今最流行的电子表格处理软件,支持丰富的计算函数及图表,在系统运营方面广泛用于运营数据报表,比如业务质量.资源利用.安全扫描等报表,同时也是应用系统常见的文件导出格式,以便数据使用人员做进一步加工处理.利用Python操作Excel的模块XlsxWriter(https://xlsxwriter.readthedocs.org),可以操作多个工作表的文字.数字.公式.图表等. 二

  • Python Image模块基本图像处理操作小结

    本文实例讲述了Python Image模块基本图像处理操作.分享给大家供大家参考,具体如下: Python 里面最常用的图像操作库是Image library(PIL),功能上,虽然还不能跟Matlab比较,但是还是比较强大的,废话补多少,写点记录笔记. 1. 首先需要导入需要的图像库: import Image 2. 读取一张图片: im=Image.open('/home/Picture/test.jpg') 3. 显示一张图片: im.show() 4. 保存图片: im.save("sa

  • Python基于opencv的图像压缩算法实例分析

    本文实例讲述了Python基于opencv的图像压缩算法.分享给大家供大家参考,具体如下: 插值方法: CV_INTER_NN - 最近邻插值, CV_INTER_LINEAR - 双线性插值 (缺省使用) CV_INTER_AREA - 使用象素关系重采样.当图像缩小时候,该方法可以避免波纹出现.当图像放大时,类似于 CV_INTER_NN 方法.. CV_INTER_CUBIC - 立方插值. 函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小.若设定 ROI,函数将按

  • python 用opencv实现图像修复和图像金字塔

    我们将学习如何通过一种称为修复的方法去除旧照片中的小噪音,笔画等.基本思路很简单:用相邻像素替换那些坏标记,使其看起来像邻域. cv2.inpaint() cv2.INPAINT_TELEA cv2.INPAINT_NS import numpy as np import cv2 as cv img = cv.imread('messi_2.jpg') mask = cv.imread('mask2.png',0) dst = cv.inpaint(img,mask,3,cv.INPAINT_T

  • python 基于opencv 绘制图像轮廓

    图像轮廓概念 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形. 谈起轮廓不免想到边缘,它们确实很像.简单的说,轮廓是连续的,边缘并不全都连续(下图).其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手:而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓. 寻找轮廓的操作一般用于二值图像,所以通常会使用阈值分割或Canny边缘检测先得到二值图. 注意:寻找轮廓是针对白色物体的,一定要保证物体是白色,而背景是黑色,不然很多人在寻找轮廓时会找到图片最外面的一

随机推荐