代码

ImageSpaceProcessing.ipynb

  1. #读取
  2. import cv2, math
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. ## 定义图像目录
  6. image_directory = 'D:\\PyDev\\CVHomework\\images\\'
  7. # 图像读取
  8. imgname = image_directory + 'lena.jpg'
  9. img = cv2.imread(imgname)
  10. # 图像显示在一个新的名字为'image'的窗口中,如果看不到,在任务栏中把窗口恢复后观察图像,在窗口中按任意键关闭窗口
  11. cv2.imshow('image',img)
  12. cv2.waitKey(0)
  13. cv2.destroyAllWindows()

1. 直方图均衡化

灰度均衡化

  1. # 计算直方图
  2. grayimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 彩色图像转化为灰度图像
  3. hist = cv2.calcHist([grayimg], [0], None, [256], [0, 256]) # 仅对 0 通道
  4. # 显示直方图
  5. r_hist = plt.hist(grayimg.ravel(), bins=256, color='b')
  6. plt.xlim([0, 255])
  7. plt.show()
  8. # 显示灰度图像
  9. cv2.imshow('grayimage',grayimg)
  10. # 直方图均衡化
  11. dstimg = cv2.equalizeHist(grayimg)
  12. # 显示均衡化的图像
  13. cv2.imshow('image',dstimg)
  14. cv2.waitKey(0)
  15. cv2.destroyAllWindows()

image.pngimage.png

彩色直方图均衡化 - 1

  1. # 图像读取
  2. imgname = image_directory + 'lena.jpg'
  3. img = cv2.imread(imgname)
  4. # Python 中成对使用三个引号,可以写大段的跨行注释
  5. """
  6. YUV色彩空间是把亮度(Luma)与色度(Chroma)分离,彩色电视采用的图像表示方法
  7. “Y”表示亮度,也就是灰度值
  8. “U”表示蓝色通道与亮度的差值
  9. “V”表示红色通道与亮度的差值
  10. 对彩色图像进行直方图均衡化时,先将图像从BGR空间转到YUV空间,然后对亮度Y通道进行直方图均衡化,然后再转换回BGR空间
  11. """
  12. img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
  13. # equalize the histogram of the Y channel
  14. img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])
  15. # convert the YUV image back to RGB format
  16. img_output = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)
  17. cv2.imshow('Color input image', img)
  18. cv2.imshow('Histogram equalized', img_output)
  19. cv2.waitKey(0)
  20. cv2.destroyAllWindows()

image.pngimage.png

彩色均衡化 - 2

  1. # 图像读取
  2. imgname = image_directory + 'lena.jpg'
  3. img = cv2.imread(imgname)
  4. """
  5. OpenCV 中有HSV空间,和HSI空间比,取值范围不同: 0-180, 0-255, 0-255
  6. 先转换到HSV空间
  7. 在V通道进行直方图均衡化
  8. 再转换回BGR空间
  9. """
  10. hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
  11. # equalize the histogram of the V channel
  12. hsv[:,:,2] = cv2.equalizeHist(hsv[:,:,2])
  13. # convert back to BGR
  14. img_output = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
  15. cv2.imshow('Color input image', img)
  16. cv2.imshow('Histogram equalized', img_output)
  17. cv2.waitKey(0)
  18. cv2.destroyAllWindows()

2. 图像平滑

2.1 平均

  1. # 图像读取
  2. imgname = image_directory + 'lena.jpg'
  3. img = cv2.imread(imgname)
  4. # 在5x5模版下进行图像平均, 该模版是 5x5个1,再除以25
  5. blur = cv2.blur( img,(5,5))
  6. # 显示原图像
  7. cv2.imshow('srcimage',img)
  8. # 显示结果图像
  9. cv2.imshow('resimage',blur)
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows()

2.2 高斯滤波

  1. # 图像读取
  2. imgname = image_directory + 'lena.jpg'
  3. img = cv2.imread(imgname)
  4. # 在5x5模版下进行图像平均, 该模版是 5x5个1,再除以25
  5. blur = cv2.blur( img,(5,5))
  6. # 显示原图像
  7. cv2.imshow('srcimage',img)
  8. # 显示结果图像
  9. cv2.imshow('resimage',blur)
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows()

2.3 中值滤波

  1. # 中值滤波, 参数确定模版的大小:5x5
  2. blur = cv2.medianBlur(img,5)
  3. # 显示原图像
  4. cv2.imshow('srcimage',img)
  5. # 显示结果图像
  6. cv2.imshow('resimage',blur)
  7. # 等待按下一个键
  8. cv2.waitKey(0)
  9. # 模版增大 5-->9
  10. blur = cv2.medianBlur(img,9)
  11. cv2.imshow('resimage',blur)
  12. # 等待按下一个键
  13. cv2.waitKey(0)
  14. # 模版增大 9-->15
  15. blur = cv2.medianBlur(img,15)
  16. cv2.imshow('resimage',blur)
  17. # 等待按下一个键
  18. cv2.waitKey(0)
  19. # 关闭所有窗口
  20. cv2.destroyAllWindows()

3. 图像梯度

  1. # 图像读取
  2. imgname = image_directory + 'lena.jpg'
  3. bgrimg = cv2.imread(imgname)
  4. img = cv2.cvtColor(bgrimg, cv2.COLOR_BGR2GRAY)
  5. # Laplace 算子; 最后一个参数决定图像的深度, -1表示和原图像一样, cv2.CV_64F 64位浮点 cv2.CV_32F 32位浮点
  6. laplacian=cv2.Laplacian(img,cv2.CV_64F)
  7. # 参数1,0 为只在x方向求一阶导数,最大可以求2 阶导数。
  8. sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
  9. # 参数0,1 为只在y方向求一阶导数,最大可以求2 阶导数。
  10. sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
  11. #转换成uint8
  12. abs_lap = cv2.convertScaleAbs( laplacian);
  13. abs_sobelx = cv2.convertScaleAbs( sobelx);
  14. abs_sobely = cv2.convertScaleAbs( sobely);
  15. abs_sobel = cv2.addWeighted( abs_sobelx, 0.5, abs_sobely, 0.5, 0 );
  16. # 同时显示原图像和结果图像
  17. cv2.imshow('srcimage',img )
  18. cv2.imshow('lapimage',abs_lap)
  19. cv2.imshow('simage',abs_sobel)
  20. cv2.waitKey(0)
  21. cv2.destroyAllWindows()

image.png

4. 利用相关进行锐化

  1. # 图像读取
  2. imgname = image_directory + 'saturn.png'
  3. bgrimg = cv2.imread(imgname)
  4. img = cv2.cvtColor(bgrimg, cv2.COLOR_BGR2GRAY)
  5. # 图像缩小
  6. img = cv2.resize(img, (int(img.shape[1]/4), int(img.shape[0]/4)) )
  7. # 定义模板
  8. kernel = np.array([[0,-1,0],
  9. [-1,5,-1],
  10. [0,-1,0]])
  11. # 空域相关操作进行滤波
  12. sharpened = cv2.filter2D(img, -1, kernel)
  13. cv2.imshow('srcimage',img )
  14. cv2.imshow('shpimage',sharpened)
  15. cv2.waitKey(0)
  16. cv2.destroyAllWindows()
  1. # 图像读取
  2. imgname = image_directory + 'saturn.png'
  3. bgrimg = cv2.imread(imgname)
  4. img = cv2.cvtColor(bgrimg, cv2.COLOR_BGR2GRAY)
  5. # 图像缩小
  6. img = cv2.resize(img, (int(img.shape[1]/4), int(img.shape[0]/4)) )
  7. # 定义模板
  8. kernel = np.array([[0,-1,0],
  9. [-1,5,-1],
  10. [0,-1,0]])
  11. # 空域相关操作进行滤波
  12. sharpened = cv2.filter2D(img, -1, kernel)
  13. cv2.imshow('srcimage',img )
  14. cv2.imshow('shpimage',sharpened)
  15. cv2.waitKey(0)
  16. cv2.destroyAllWindows()
  1. # 图像读取
  2. imgname = image_directory + 'word.png'
  3. bgrimg = cv2.imread(imgname)
  4. img = cv2.cvtColor(bgrimg, cv2.COLOR_BGR2GRAY)
  5. # 定义模板
  6. kernel = np.array([[-1,-1,-1,-1,-1],
  7. [-1, 2, 2, 2,-1],
  8. [-1, 2, 8, 2,-1],
  9. [-1, 2, 2, 2,-1],
  10. [-1,-1,-1,-1,-1]]) / 8.0
  11. # 空域相关操作进行滤波
  12. sharpened = cv2.filter2D(img, -1, kernel)
  13. cv2.imshow('srcimage',img )
  14. cv2.imshow('shpimage',sharpened)
  15. cv2.waitKey(0)
  16. cv2.destroyAllWindows()

image.pngimage.png

5. 利用相关进行滤波,检测不同的边

  1. # 图像读取
  2. imgname = image_directory + 'House.tiff'
  3. bgrimg = cv2.imread(imgname)
  4. img = cv2.cvtColor(bgrimg, cv2.COLOR_BGR2GRAY)
  5. # 定义模板
  6. kernel_emboss_1 = np.array([[0,-1,-1],
  7. [1,0,-1],
  8. [1,1,0]])/3.0
  9. kernel_emboss_2 = np.array([[-1,-1,0],
  10. [-1,0,1],
  11. [0,1,1]])/3.0
  12. kernel_emboss_3 = np.array([[1,0,0],
  13. [0,0,0],
  14. [0,0,-1]])
  15. # 空域滤波
  16. k1 = cv2.filter2D(img, cv2.CV_32F, kernel_emboss_1)
  17. k2 = cv2.filter2D(img, cv2.CV_32F, kernel_emboss_2)
  18. k3 = cv2.filter2D(img, cv2.CV_32F, kernel_emboss_3)
  19. absk1 = cv2.convertScaleAbs( k1)+88
  20. absk2 = cv2.convertScaleAbs( k2)+88
  21. absk3 = cv2.convertScaleAbs( k3)+88
  22. cv2.imshow('srcimage',img )
  23. cv2.imshow('k1image',absk1)
  24. cv2.imshow('k2image',absk2)
  25. cv2.imshow('k3image',absk3)
  26. cv2.waitKey(0)
  27. cv2.destroyAllWindows()

image.png

知识点

3.1 背景知识

3.2基本灰度变换

  1. 灰度变换函数 s=T(r)

  2. 反转变换
  3. 对数变换与指数变换
    1. 对数:低灰度区域拓展
    2. 指数:高灰度区域拓展
  4. 幂次变换
    1. γ校正
  5. 分段线性形函数

    3.3 直方图处理

    image.pngimage.png

    3.4算数逻辑增强

  6. 算术逻辑操作

  7. 图像平均

    3.5空域滤波器


    1. 相关概念

image.png
空域滤波过程
image.png
image.png

  1. 平滑空间滤波器
    1. 目的:消除噪声、 去除太小的细节或将目标内的小间断连接起来实现模糊
    2. 方法:
      1. 平均
        1. 邻域平均法
        2. 加权邻域平均法
        3. 阈值邻域平均法
      2. 中值滤波
        1. 用一个含有奇数点的滑动窗口,将邻域中的像素按灰度级排序,取其中间值为输出像素
        2. 抑制图像随机脉冲噪声的同时不使边缘模糊。但对于线、尖顶等细节多的图像不宜采用中值滤波。
        3. 运算速度快,便于实时处理
      3. 图像锐化
      4. 边缘检测:
        1. 步骤:滤波、增强、检测
        2. Marr算法
        3. Canny边缘检测
      5. 边缘检测评价

课件

机器视觉-第3章-空间域图像增强.pdf
机器视觉-第3章-空间域图像增强-2.pdf