2022-03-27 图像滤波和几何变换(实验)

人工智能应用——图像滤波和几何变换

一、实验目的

(1)掌握图像颜色空间和直方图知识
(2)掌握图像的点运算和集合变换
(3)掌握数学形态学滤波

二、实验内容与记录
  1. 使用OpenCV将彩色图片转成灰度图片,并得到图片的灰度直方图
    在这里插入图片描述
    代码:
import cv2 as cv
img = cv.imread("\small_fish.jpg",1)
img_1 = cv.cvtColor(img,cv.COLOR_BGR2GRAY)cv.imshow('gray',img_1)
cv.imshow('colour',img)
cv.waitKey(0)
  1. 使用OpenCV对图片进行均值滤波、高斯滤波、中值滤波
  • 均值滤波:

在这里插入图片描述
代码:

import cv2 as cv
img = cv.imread("\small_fish.jpg",1)
ave = cv.blur(img, (3, 3))cv.imshow('average blur',ave)
cv.waitKey(0)
  • 高斯滤波:
    在这里插入图片描述
    代码:
import cv2 as cv
img = cv.imread("\small_fish.jpg",1)
Gausi = cv.GaussianBlur(img, (3, 3), 1)cv.imshow('GaussianBlur', Gausi)
cv.waitKey(0)
  • 中值滤波:
    在这里插入图片描述
    代码:
import cv2 as cv
img = cv.imread("\small_fish.jpg",1)
med = cv.medianBlur(img, 3)cv.imshow('medianBlur',med)
cv.waitKey(0)
  1. 使用OpenCV对图像进行缩放、旋转、相似变换、仿射变换
  • 缩放:
    在这里插入图片描述
    代码:
import cv2 as cv
import numpy as npimg = cv.imread("\small_fish.jpg",1)
res1 = cv.resize(img, None, fx=2, fy=2, interpolation=cv.INTER_CUBIC)
height, width = img.shape[:2]
res2 = cv.resize(img, (int(0.8*width), int(0.8*height)), interpolation=cv.INTER_LANCZOS4)cv.imshow('origin_pic',img)
cv.imshow('res1',res1)
cv.waitKey(0)
  • 旋转:
    在这里插入图片描述
    代码:
import cv2 as cv
import numpy as npimg = cv.imread("\small_fish.jpg",1)
rows, cols = img.shape[:2]
center = (rows/2, cols/2)
M = cv. getRotationMatrix2D(center, 30, 0.8)
dst = cv. warpAffine(img, M, (cols, rows)) cv.imshow('img',img)
cv.imshow('dst',dst)
cv.waitKey(0)
  • 相似变换:
    在这里插入图片描述
    代码:
import cv2 as cv
import numpy as npimg = cv.imread("\small_fish.jpg",1)
rows, cols = img.shape[:2]
center = (rows/2, cols/2)
M = cv. getRotationMatrix2D(center, 30, 0.8)
img_rotate = cv.warpAffine(img, M, (img.shape[0], img.shape[1]))plt.figure(figsize=(8,8))
plt.subplot(1,2,1)
plt.imshow(img)
plt.subplot(1,2,2)
plt.imshow(img_rotate)
plt.show()
  • 仿射变换:
    在这里插入图片描述
    代码:
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as npimg = cv.imread("\small_fish.jpg",1)
img = cv.cvtColor(img, cv2.COLOR_BGR2RGB)rows, cols = img.shape[:2]
pt1 = np.float32([[0,0], [cols, 0], [0, rows]])
pt2 = np.float32([[cols*0.3, rows*0.3], [cols*0.8, rows*0.2], [cols*0.1, rows*0.9]])
M = cv.getAffineTransform(pt1, pt2)
dst = cv.warpAffine(img, M, (cols, rows)) plt.figure(figsize=(8,8))
plt.subplot(1,2,1)
plt.imshow(img)
plt.subplot(1,2,2)
plt.imshow(dst)
plt.show()
  1. 使用OpenCV对图片进行二值化,然后对二值图进行腐蚀、膨胀、开运算、闭运算
  • 腐蚀:
    在这里插入图片描述
    代码:
import numpy as np
import cv2 as cv
from matplotlib import pyplot as pltimg = cv.imread("\small_fish.jpg", cv.IMREAD_GRAYSCALE)
kernel = np.ones((5, 5), np.uint8)
erosion = cv.erode(img, kernel, iterations=1)plt.subplot(121), plt.imshow(img, cmap="gray"), plt.title("Original")
plt.subplot(122), plt.imshow(erosion, cmap="gray"), plt.title("Erosion")
plt.show()
  • 膨胀:
    在这里插入图片描述
    代码:
import numpy as np
import cv2 as cv
from matplotlib import pyplot as pltimg = cv.imread("\small_fish.jpg", cv.IMREAD_GRAYSCALE)
kernel = np.ones((5, 5), np.uint8)
dilation = cv2.dilate(img, kernel, iterations=1)plt.subplot(121), plt.imshow(img, cmap="gray"), plt.title("Original")
plt.subplot(122), plt.imshow(erosion, cmap="gray"), plt.title("Erosion")
plt.show()
  • 开运算:
    在这里插入图片描述
    代码:
import numpy as np
import cv2 as cv
from matplotlib import pyplot as pltimg = cv.imread("\small_fish.jpg", cv.IMREAD_GRAYSCALE)
kernel = np.ones((5, 5), np.uint8)
opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)plt.subplot(121), plt.imshow(img, cmap="gray"), plt.title("Original")
plt.subplot(122), plt.imshow(opening, cmap="gray"), plt.title("Opening")
plt.show()
  • 闭运算:
    在这里插入图片描述
    代码:
import numpy as np
import cv2 as cv
from matplotlib import pyplot as pltimg = cv.imread("\small_fish.jpg", cv.IMREAD_GRAYSCALE)
kernel = np.ones((5, 5), np.uint8)
close = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)plt.subplot(121), plt.imshow(img, cmap="gray"), plt.title("Original")
plt.subplot(122), plt.imshow(close, cmap="gray"), plt.title("Close")
plt.show()
三、实验分析和总结
  • 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,不一定为整数坐标。这时就需要灰度级差值将映射的新坐标匹配到输出像素之间。最简单的插值方法是最近邻插值,就是令输出像素的灰度值等于映射最近的位置像素,该方法可能会产生锯齿。这种方法也叫零阶插值,相应比较复杂的还有一阶和高阶插值。
  • 在几何变换中,OpenCV 提供了两个变换函数,cv2.warpAffine 和 cv2.warpPerspective,使用这两个函数你可以实现所有类型的变换。cv2.warpAffine 接收的参数是2 x 3 的变换矩阵,而 cv2.warpPerspective 接收的参数是 3 x 3 的变换矩阵。
四、思考题
  1. 查阅资料,探讨均值滤波、高斯滤波、中值滤波对不同噪声的作用。
    答:均值滤波:均值滤波是线性滤波,线性滤波易于实现,且易于从频率响应的角度分析。但是噪声是颗粒噪声(如椒盐噪声)而非高斯噪声时,现形滤波不能去除噪声。
    高斯滤波:高斯滤波是最常用的图像去噪方法之一,它能很好地滤除掉图像中随机出现的高斯噪声,高斯滤波是一种低通滤波,它在滤除图像中噪声信号的同时,也会对图像中的边缘信息进行平滑,表现出来的结果就是图像变得模糊。高斯滤波之所以会导致图像变得模糊,是因为它在滤波过程中只关注了位置信息。
    中值滤波:图像出现极值点,比如椒盐噪声产生的噪点,线性滤波只是将噪声转换为平缓但仍可见的散粒,最佳的解决方式是通过非线性滤波例如中值滤波来滤除噪声。

  2. 简述数学形态学各个滤波的功能。
    答:膨胀、腐蚀、开、闭运算是数学形态学最基本的变换。
    腐蚀的最简单的应用是从图中消除不相关的细节,而膨胀最简单的应用是将裂缝桥接起来。开运算是先腐蚀再膨胀,开运算一般断开狭窄的间断和消除细的突出物,而闭操作通常消弥狭窄的间断和长细的鸿沟,消除小的孔洞,并填充轮廓线中的断裂。开运算与闭运算的结合使用能使作用对象的轮廓变得光滑。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部