一、灰度变换
变换原理
数字图像在计算机上是以位图的形式存在的。位图每一个点称为象素。在数字图像中各个象素所具有的明暗程度称为灰度,灰度值通常用函数f(x,y)表示,x和y是象素点在像平面中的坐标。
灰度变换的是对图像上各个象素点的灰度值按某个函数变换到y。灰度变换是图像增强的重要方法之一,它可以使图像动态范围增大,图像对比度扩展,图像变清晰,特征更加明显。常用的灰度变换方法川有线性变换、分段线性变换、非线性灰度变换。
代码实现
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
image=Image.open(r'.\lay.png')
plt.imshow(image)
import matplotlib.image as mpimg
pic=mpimg.imread(r".\lay.png")
pic_1=pic[0:638,0:638,0]#[]中的参数就是要处理的坐标
plt.imshow(pic_1,cmap='Greys_r')#将此行换成plt.imshow(pic_1)就是热度处理
plt.show()
output
二、阈值分割
分割原理
比较目标区域与背景区域, 若目标区域足够大, 且二者有明显的灰度差别, 则该图像的灰度直方图包络线就呈现双峰一谷的曲线。由于 目标边 界点数较少, 其灰度介于二者之间, 因此可将谷底的灰度定为分割闭值。确定谷底的方法是先做直方图, 然后人工找谷底, 并把阈值选择在此处
生成直方图
from scipy import misc
from PIL import Image
from pylab import *
from numpy import *
def histeq(im,nbr_bins = 256):
"""对一幅灰度图像进行直方图均衡化"""
#计算图像的直方图
#在numpy中,也提供了一个计算直方图的函数histogram(),第一个返回的是直方图的统计量,第二个为每个bins的中间值
imhist,bins = histogram(im.flatten(),nbr_bins,normed= True)
cdf = imhist.cumsum() #
cdf = 255.0 * cdf / cdf[-1]
#使用累积分布函数的线性插值,计算新的像素值
im2 = interp(im.flatten(),bins[:-1],cdf)
return im2.reshape(im.shape),cdf
pil_im = Image.open(r'lay.png') #打开原图
pil_im_gray = pil_im.convert('L') #转化为灰度图像
pil_im_gray.show() #显示灰度图像
im = array(Image.open(r'lay.png').convert('L'))
figure()
hist(im.flatten(),600)
im2,cdf = histeq(im)
figure()
hist(im2.flatten(),256)
show()
im2 = Image.fromarray(uint8(im2))
im2.show()
print(cdf)
plot(cdf)
output
从结果可以看出图片属于单门限阈值,阈值大致在70左右
阈值分割代码
import cv2 as cv
import numpy as np
def threshold_demo(image): #全局阈值
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY|cv.THRESH_OTSU)
print("threshold value %s"%ret)
cv.imshow("global_threshold_binary", binary)
src = cv.imread(r"greylay.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
threshold_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
output:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/aaa022b8a5ed5605f5d34fd8096fd270.png)
三、图像的膨胀和腐蚀
膨胀和腐是对二值图像连接成分的变形操作。膨胀是对连接成分的边界扩大一层的处理。腐蚀是将连接成分的边界点去掉从而使连接成份的边界缩小一层的处理。
根据得到的直方图采用OTSU阈值分割,实现图像的二值化,可以看到人物的手部,脖子,衣领等等地方都被识别为亮部,要进行人脸识别需要进一步对图像进行膨胀和腐蚀。膨胀是对连接成分的边界扩大的处理,腐蚀是将连接成分的边界点去掉使边界缩小的处理。这里需要膨胀脸部,腐蚀双手等部位。
人脸检测这里使用基于肤色特征的人脸检测,但由于光照和脸部器官的影响,人脸区域可能与其他类肤色区域连在一起,需要进行使用一定规则进行归并,再使用otsu阈值分割,膨胀腐蚀进行检测,如果效果不太好可能会需要多次膨胀与腐蚀