计算机视觉——引言,图像处理基础

图像轮廓和直方图

图像直方图原理

直方图显示图像数据时会以左暗又亮的分布曲线形式呈现出来,而不是显示原图像数据,并且可以通过算法来对图像进行按比例缩小,且具有图像平移、旋转、缩放不变性等众多优点。直方图在进行图像计算处理时代价较小,所以经常用于图像处理!为什么说直方图计算代价较小?例如一个1024x1024的图像,当转换成直方图时会进行其分组,列如分为255组,那么这1024x124个像素会被叠加分到这255组中去,即处理起虽然值变大了,但是像素点变少了,不需要去拆分rgb(hsv除外)三色,不需要单步计算等额外的工作,只需要通过特定的算法对这255组进行计算即可,所以说代价是较小的!
总的来说,图像直方图就象是一种分布统计一样的概念,可以先这么简单的理解。比如一幅图像1920x1080的RGB图像,我们可以仅选择一个通道来进行分析,将0-255不同值分布在一个笛卡尔坐标系的X轴上,纵轴可以理解为X轴对应像素值的数量,例如X轴的200,对应Y轴值是50,就表示值是200的像素有50个。

图像轮廓线和图线等高线。在画图像轮廓前需要转换为灰度图像,因为轮廓需要获取每个坐标[x,y]位置的像素值。

代码

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
im = array(Image.open('../data/convert_images_format_test/cartoon.jpg').convert('L'))  # 打开图像,并转成灰度图像

figure()
subplot(121)
gray()
contour(im, origin='image')
axis('equal')
axis('off')
title(u'图像轮廓', fontproperties=font)

subplot(122)
hist(im.flatten(), 128)
title(u'图像直方图', fontproperties=font)
plt.xlim([0,260])
plt.ylim([0,11000])

show()

运行结果

运行结果

直方图均衡化

原理

直方图均衡化就是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内均匀分布的技术。直方图均衡化能起到增强图像对比度的作用,增加图像灰度级的动态范围,有利于目视判图。
利用一个指定变换函数对直方图进行均衡化
变换函数:

def histeq(im,nbr_bins=256):
    """    Histogram equalization of a grayscale image. """
    
    # get image histogram
    imhist,bins = histogram(im.flatten(),nbr_bins,normed=True)
    cdf = imhist.cumsum() # cumulative distribution function
    cdf = 255 * cdf / cdf[-1] # normalize
    
    # use linear interpolation of cdf to find new pixel values
    im2 = interp(im.flatten(),bins[:-1],cdf)
    
    return im2.reshape(im.shape), cdf

代码

from PIL import Image
from numpy import *
from PCV.tools import imtools
from pylab import *

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

im = array(Image.open('../data/convert_images_format_test/food.jpg').convert('L'))
im2,cdf = imtools.histeq(im)

figure()
subplot(2, 3, 1)
axis('off')
gray()
title(u'原始图像', fontproperties=font)
imshow(im)

subplot(2, 3, 3)
axis('off')
title(u'直方图均衡化后的图像', fontproperties=font)
imshow(im2)

subplot(2, 3, 4)
axis('off')
title(u'原始直方图', fontproperties=font)
#hist(im.flatten(), 128, cumulative=True, normed=True)
hist(im.flatten(), 128, density=True)

subplot(2, 3, 5)
axis('off')
title(u'变换函数', fontproperties=font)
#hist(im.flatten(), 128, cumulative=True, normed=True)
plot(cdf)

subplot(2, 3, 6)
axis('off')
title(u'均衡化后的直方图', fontproperties=font)
#hist(im2.flatten(), 128, cumulative=True, normed=True)
hist(im2.flatten(), 128, density=True)

show()

运行结果

运行结果

图像模糊(高斯滤波)

原理

高斯滤波器是一种平滑线性滤波器,使用高斯滤波器对图像进行滤波,其效果是降低图像灰度的“尖锐”变化,也就是使图像“模糊”了。高斯滤波对于抑制服从正态分布的噪声效果非常好,其代价是使图像变得“模糊”。当然,有时对图像进行平滑滤波的目的就是让图像变得模糊。

代码

 # -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from scipy.ndimage import filters

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

#im = array(Image.open('board.jpeg'))
im = array(Image.open('../data/convert_images_format_test/cartoon.jpg').convert('L'))

figure()
gray()
axis('off')
subplot(1, 4, 1)
axis('off')
title(u'原图', fontproperties=font)
imshow(im)

for bi, blur in enumerate([2, 5, 10]):
  im2 = zeros(im.shape)
  im2 = filters.gaussian_filter(im, blur)
  im2 = np.uint8(im2)
  imNum=str(blur)
  subplot(1, 4, 2 + bi)
  axis('off')
  title(u'标准差为'+imNum, fontproperties=font)
  imshow(im2)

#如果是彩色图像,则分别对三个通道进行模糊
#for bi, blur in enumerate([2, 5, 10]):
#  im2 = zeros(im.shape)
#  for i in range(3):
#    im2[:, :, i] = filters.gaussian_filter(im[:, :, i], blur)
#  im2 = np.uint8(im2)
#  subplot(1, 4,  2 + bi)
#  axis('off')
#  imshow(im2)

show()

运行结果

运行结果

*灰度变换

原理

灰度变换也被称为图像的点运算(只针对图像的某一像素点)是所有图像处理技术中最简单的技术,其变换形式如下:
s = T®
其中,T是灰度变换函数;r是变换前的灰度;s是变换后的像素。

代码

# -*- coding: utf-8 -*-
from PIL import Image
from numpy import *
from pylab import *

im = array(Image.open('../data/convert_images_format_test/happy.jpg').convert('L'))
print (int(im.min()), int(im.max()))

im2 = 255 - im  # invert image
print (int(im2.min()), int(im2.max()))

im3 = (100.0/255) * im + 100  # clamp to interval 100...200
print (int(im3.min()), int(im3.max()))

im4 = 255.0 * (im/255.0)**2  # squared
print (int(im4.min()), int(im4.max()))

figure()
gray()
subplot(1, 3, 1)
imshow(im2)
axis('off')
title(r'$f(x)=255-x$')

subplot(1, 3, 2)
imshow(im3)
axis('off')
title(r'$f(x)=\frac{100}{255}x+100$')

subplot(1, 3, 3)
imshow(im4)
axis('off')
title(r'$f(x)=255(\frac{x}{255})^2$')
show()

运行结果

运行结果
左边灰度变换函数采用的是f(x)=255-x,中间采用的是f(x)=(100/255)x+100,右边采用的是变换函数是f(x)=255(x/255)^2。
对每幅图像用到了打印最小像素值和最大像素值:
运行结果

*调整尺寸及旋转

方法

要对一幅图像的尺寸进行调整,可以调用resize()方法,元组中放置的便是你要调整尺寸的大小。如果要对图像进行旋转变换的话,可以调用rotate()方法。

代码

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
figure()

# 显示原图
pil_im = Image.open('../data/convert_images_format_test/cartoon.jpg')
print(pil_im.mode, pil_im.size, pil_im.format)
subplot(131)
title(u'原图', fontproperties=font)
axis('off')
imshow(pil_im)

# 显示灰度图
pil_im = Image.open('../data/convert_images_format_test/cartoon.jpg').convert('L')
gray()
subplot(132)
title(u'灰度图', fontproperties=font)
axis('off')
imshow(pil_im)

size = 128, 128
# 调整图像尺寸
pil_im = Image.open('../data/convert_images_format_test/cartoon.jpg')
pil_im = pil_im.resize(size)
print (pil_im.size)
subplot(133)
title(u'调整尺寸后的图像', fontproperties=font)
axis('off')
imshow(pil_im)

show()

运行结果

运行结果
控制台输出:
原图的色彩模式、图片大小、格式
缩略图大小
调整图像尺寸后图像大小
运行结果

* 图像差分

原理

图像差分即对图像进行边缘检测。利用sobel算子对x、y方向上分别进行边缘检测,利用梯度算子对图像进行梯度幅度的边缘检测

代码

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from scipy.ndimage import filters
import numpy

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

im = array(Image.open('../data/convert_images_format_test/happy.jpg').convert('L'))
gray()

subplot(1, 4, 1)
axis('off')
title(u'(a)原图', fontproperties=font)
imshow(im)

# Sobel derivative filters
imx = zeros(im.shape)
filters.sobel(im, 1, imx)
subplot(1, 4, 2)
axis('off')
title(u'(b)x方向差分', fontproperties=font)
imshow(imx)

imy = zeros(im.shape)
filters.sobel(im, 0, imy)
subplot(1, 4, 3)
axis('off')
title(u'(c)y方向差分', fontproperties=font)
imshow(imy)

#mag = numpy.sqrt(imx**2 + imy**2)
mag = 255-numpy.sqrt(imx**2 + imy**2)
subplot(1, 4, 4)
title(u'(d)梯度幅度', fontproperties=font)
axis('off')
imshow(mag)

show()

运行结果

运行结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值