实验1
实验内容
该代码演示了如何使用OpenCV库中的WarpAffine函数进行图像基础的仿射变换
代码注释
import numpy as np
import cv2 as cvimg = cv.imread(r'test.jpg', 1)
rows, cols, channels = img.shape
M = np.float32([[1,0,100],[0,1,50]])
res = cv.warpAffine(img, M, (cols, rows))
cv.imshow('img', res)
cv.waitKey(0)
cv.destroyAllWindows()
效果演示
功能说明
该代码使用WarpAffine函数实现了一种基础的二维仿射变换技术。具体步骤如下:
-
图像读取:使用cv.imread函数读取指定路径下的图像文件,将读取结果存储到img变量。
-
图像属性获取:使用ndarray.shape方法获取图片的行、列、通道数量等属性。
-
转换矩阵构建:使用numpy库中的float32方法生成一个2x3的转换矩阵(M),并选定x、y轴方向上的偏移量(100个单位和50个单位).
-
图像仿射变换:使用cv.warpAffine函数实现图片的仿射变换,该变换是平移变换的一种,可实现对图像的水平、竖直方向上进行偏移。
-
图像显示:使用cv.imshow函数对opencv库中所读取的图像进行展示。
-
等待按键输入:使用cv.waitKey函数等待按键输入,参数为0表示无限等待。
-
关闭窗口:使用cv.destroyAllWindows函数关闭图像显示窗口。
效果分析比较
此代码实现了一种基础的二维仿射变换操作。结果图像相对于原始图像向x轴方向平移100个单位,向y轴方向平移50个单位。相比于原始图像,变换后的图像中心位置向右下方偏移。可以通过对比两张图像,观察到图像位置发生了变化。
结论
该代码演示了如何使用基本图像处理方法对图像进行仿射变换操作。仿射变换是图像处理中常用的基本变换操作之一,可实现对图像的旋转、平移等变换,适用于将图像转换成指定的形状和位置。在OpenCV库中,可通过WarpAffine等函数实现对图像的旋转、平移等仿射操作。
实验2
实验内容
该代码使用OpenCV库中的函数实现了图像的旋转和缩放操作。具体实验内容如下:
-
读取名为 “test.jpg” 的图像。
-
获取图像的行数和列数。
-
创建旋转矩阵
M
,将图像绕图像中心旋转60度,并进行1.2倍的缩放。 -
使用
cv2.warpAffine
进行图像的旋转和缩放操作。 -
使用
cv2.imshow
展示旋转和缩放后的图像。 -
通过
cv2.waitKey
和cv2.destroyAllWindows
函数等待按键输入并关闭窗口。
代码注释
import cv2
import numpy as npimg=cv2.imread('test.jpg')rows,cols=img.shape[:2]M=cv2.getRotationMatrix2D((cols/2,rows/2),60,1.2)
#第一个参数是旋转中心,第二个参数是旋转角度,第三个因子是旋转后的缩放因子shuchu=cv2.warpAffine(img,M,(2*cols,rows)) # 第三个参数是输出图像的尺寸中心,图像的宽和高
while(1):cv2.imshow('Result',shuchu)if cv2.waitKey(1)&0xFF==27:break
cv2.destroyAllWindows()
效果演示
功能说明
该代码基于OpenCV库,利用旋转矩阵 M
对图像进行了旋转和缩放操作。主要步骤如下:
-
图像读取:使用
cv2.imread
函数读取名为 “test.jpg” 的图像。 -
获取图像属性:通过提取图像的行数和列数,获取图像的尺寸。
-
旋转矩阵创建:使用
cv2.getRotationMatrix2D
创建旋转矩阵M
。在该例中,以图像中心为中心点,旋转60度,并缩放1.2倍。 -
图像旋转和缩放:使用
cv2.warpAffine
对原始图像进行旋转和缩放操作。 -
图像展示:使用
cv2.imshow
展示旋转和缩放后的图像。 -
循环展示:通过
cv2.waitKey
函数循环展示旋转后的图像,若按下 ESC 键(ASCII码为27),则关闭图像展示。 -
关闭窗口:使用
cv2.destroyAllWindows
关闭图像展示窗口。
效果分析比较
该代码实现了图像的旋转和缩放操作。旋转后的图像通过旋转中心、旋转角度和缩放因子的调整,使得图像发生了旋转并保持了一定的尺寸。
结论
此代码演示了如何使用OpenCV对图像进行旋转和缩放操作。通过旋转矩阵的设定,可以对图像进行不同程度和方式的旋转,并通过缩放因子调整图像的尺寸。这种操作在图像处理和计算机视觉中很常见,可用于各种应用场景,如图像增强、目标检测、图像配准等。
指令
实验3
实验内容
该代码实现了一个自定义函数,用于对图像进行旋转操作。具体实现内容如下:
-
读取名为 “test.jpg” 的图像。
-
定义一个名为
rotate_bound
的函数,接受两个参数:图像和旋转角度。 -
在函数内部,获取图像的尺寸以及图像中心点的坐标。
-
利用
cv2.getRotationMatrix2D
获取旋转矩阵M
,应用负值的旋转角度。 -
计算图像的新边界尺寸,根据旋转矩阵的旋转分量(正弦和余弦)。
-
调整旋转矩阵以考虑平移,并添加到
M
中。 -
使用
cv2.warpAffine
对图像进行实际旋转,并返回旋转后的图像。 -
使用
cv2.imshow
循环展示旋转后的图像。 -
使用
cv2.waitKey
和cv2.destroyAllWindows
函数等待按键输入并关闭窗口。
代码注释
import cv2
import numpy as npimg = cv2.imread('test.jpg')def rotate_bound(image, angle):# 抓取图像的尺寸,然后确定中心(h, w) = image.shape[:2](cX, cY) = (w // 2, h // 2)# 抓取旋转矩阵(应用角度的负数顺时针旋转),然后抓取正弦和余弦# (即矩阵的旋转分量)M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)cos = np.abs(M[0, 0])sin = np.abs(M[0, 1])# 计算图像的新边界尺寸nW = int((h * sin) + (w * cos))nH = int((h * cos) + (w * sin))# 调整旋转矩阵以考虑平移M[0, 2] += (nW / 2) - cXM[1, 2] += (nH / 2) - cY# 执行实际旋转并返回图像shuchu = cv2.warpAffine(image, M, (nW, nH))while (1):cv2.imshow('shuchu', shuchu)if cv2.waitKey(1) & 0xFF == 27:breakrotate_bound(img, 45)
效果演示
功能说明
该代码实现了一个自定义函数,用于对图像进行旋转操作。该函数使用 cv2.getRotationMatrix2D
获取旋转矩阵,并利用 cv2.warpAffine
对图像进行旋转。
具体步骤如下:
-
图像读取:使用
cv2.imread
函数读取名为 “test.jpg” 的图像。 -
函数定义:定义函数
rotate_bound
,接受两个参数:图像和旋转角度。 -
图像尺寸和中心点计算:在函数内部,使用
image.shape[:2]
获取图像的尺寸,并计算图像中心点的坐标。 -
旋转矩阵获取:使用
cv2.getRotationMatrix2D
获取旋转矩阵M
,将图像中心点作为旋转的参考点,应用负值的旋转角度。 -
新边界尺寸计算:根据旋转矩阵的旋转分量(正弦和余弦),计算图像的新边界尺寸。
-
平移调整:调整旋转矩阵以考虑平移,并添加到
M
中。 -
图像旋转:使用
cv2.warpAffine
对图像进行实际旋转,并返回旋转后的图像。 -
图像展示:使用
cv2.imshow
循环展示旋转后的图像。 -
等待按键输入:使用
cv2.waitKey
函数等待按键输入,参数为1表示等待1毫秒,若按下 ESC 键(ASCII码为27),则退出循环。 -
关闭窗口:使用
cv2.destroyAllWindows
关闭图像展示窗口。
效果分析比较
该代码实现了图像的旋转操作。传入的参数是图像和旋转角度,函数内部根据图像尺寸和旋转角度计算旋转矩阵和新的边界尺寸,并通过 cv2.warpAffine
对图像进行旋转操作。
结论
该代码实现了一个自定义函数,用于对图像进行旋转操作。函数通过获取图像的尺寸和中心点,计算旋转矩阵和新的边界尺寸,并应用于图像,实现图像的旋转操作。旋转操作在计算机视觉和图像处理中经常用到,可用于目标检测、图像配准、特征提取等应用。
实验4
实验内容
该代码实现了图像的仿射变换操作,将一个三角形的区域映射到另一个三角形的区域。具体实现内容如下:
-
读取名为 “test.jpg” 的图像。
-
定义一个名为
p1
的二维数组,包含原始三角形的三个顶点的坐标。 -
定义一个名为
p2
的二维数组,包含目标三角形的三个顶点的坐标。 -
使用
cv.getAffineTransform
函数获取仿射变换矩阵M
,输入参数为p1
和p2
。 -
使用
cv.warpAffine
函数对图像进行仿射变换,输入参数为图像、仿射变换矩阵和输出图像的尺寸。 -
使用
cv.imshow
函数展示原始图像和变换后的图像。 -
使用
cv.waitKey
和cv.destroyAllWindows
函数等待按键输入并关闭窗口。
代码注释
import numpy as np
import cv2 as cvimg = cv.imread(r'test.jpg', 1)
rows, cols, channels = img.shape
p1 = np.float32([[0,0], [cols-1,0], [0,rows-1]])
p2 = np.float32([[0,rows*0.3], [cols*0.8,rows*0.2], [cols*0.15,rows*0.7]])
M = cv.getAffineTransform(p1, p2)
dst = cv.warpAffine(img, M, (cols,rows))
cv.imshow('original', img)
cv.imshow('result', dst)
cv.waitKey(0)
cv.destroyAllWindows()
效果演示
original
result
功能说明
该代码实现了图像的仿射变换操作,将一个三角形的区域映射到另一个三角形的区域。
具体步骤如下:
-
图像读取:使用
cv.imread
函数读取名为 “test.jpg” 的彩色图像。 -
三角形定义:定义二维数组
p1
和p2
,分别表示原始三角形和目标三角形的三个顶点的坐标。 -
仿射变换矩阵获取:使用
cv.getAffineTransform
函数获取仿射变换矩阵M
,输入参数为p1
和p2
。 -
图像仿射变换:使用
cv.warpAffine
函数对图像进行仿射变换,输入参数为图像、仿射变换矩阵M
和输出图像的尺寸。 -
图像展示:使用
cv.imshow
展示原始图像和变换后的图像。 -
等待按键输入:使用
cv.waitKey(0)
函数等待按键输入,参数为0表示无限等待,直到按下任意键。 -
关闭窗口:使用
cv.destroyAllWindows
关闭图像展示窗口。
效果分析比较
该代码实现了图像的仿射变换操作。通过定义原始三角形和目标三角形的顶点,计算仿射变换矩阵,并使用 cv.warpAffine
函数对图像进行仿射变换。
结论
该代码实现了图像的仿射变换操作,将一个三角形的区域映射到另一个三角形的区域。仿射变换在计算机视觉和图像处理中经常用到,可用于图像的转换、纠正、拉伸等操作。本代码通过定义原始三角形和目标三角形的顶点,并利用仿射变换矩阵对图像进行变换,实现了图像的仿射变换操作。
实验5
实验内容
该代码实现了图像的缩放操作,包括放大和缩小。具体实现内容如下:
-
定义了一个名为
resizeImage
的函数,接受图像、目标宽度、目标高度和插值方法作为参数。 -
在函数内部,首先根据目标宽度和高度计算新的尺寸。
-
然后根据图像的原始尺寸和目标尺寸的关系,选择高度缩放或宽度缩放。
-
最后使用
cv2.resize
函数对图像进行缩放操作,并返回缩放后的图像。 -
在主程序中,首先读取名为 “lakeWater.jpg” 的图像,并展示原始图像。
-
通过调用
resizeImage
函数对图像进行放大操作,放大倍数为2倍,并展示放大后的图像。 -
使用
cv2.imwrite
函数保存放大后的图像。 -
再次调用
resizeImage
函数对图像进行缩小操作,缩小倍数为5倍,并保存缩小后的图像。 -
使用
cv2.imshow
展示缩小后的图像,并等待按键输入。 -
使用
cv2.destroyAllWindows
关闭图像展示窗口。
代码注释
import numpy as np
import cv2def resizeImage(image,width=None,height=None,inter=cv2.INTER_AREA):newsize = (width,height)#获取图像尺寸(h,w) = image.shape[:2]if width is None and height is None:return image#高度算缩放比例if width is None:n = height/float(h)newsize = (int(n*w),height)else :n = width/float(w)newsize = (width,int(h*n))# 缩放图像newimage = cv2.resize(image, newsize, interpolation=inter)return newimageimageOriginal = cv2.imread("lakeWater.jpg")
cv2.imshow("Original", imageOriginal)
#获取图像尺寸
w = width=imageOriginal.shape[1]
h = width=imageOriginal.shape[2]
print ("Image size:",w,h)
#放大2倍
newimage = resizeImage(imageOriginal,w*2,h*2,cv2.INTER_LINEAR)
cv2.imshow("New", newimage)
#保存缩放后的图像
cv2.imwrite('newimage.jpg',newimage)
#缩小5倍
newimage2 = resizeImage(imageOriginal,int(w/5),int(h/5),cv2.INTER_LINEAR)
cv2.imwrite('newimage2.jpg',newimage2)
cv2.imshow('result', newimage)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果演示
original
New
result
功能说明
该代码实现了一个自定义函数 resizeImage
,用于对图像进行缩放操作。该函数接受图像、目标宽度、目标高度和插值方法作为参数,根据目标宽度和高度计算新的尺寸,并根据图像的原始尺寸和目标尺寸的关系选择高度缩放或宽度缩放。最后使用 cv2.resize
函数对图像进行缩放操作。
主程序中,首先读取图像并展示原始图像,然后通过调用 resizeImage
函数对图像进行放大和缩小操作,并展示和保存缩放后的图像。
效果分析比较
该代码通过自定义函数实现了图像的缩放操作,包括放大和缩小。通过调用 resizeImage
函数,并传入目标宽度、目标高度和插值方法,对图像进行缩放操作。放大时可以指定放大倍数,缩小时可以指定缩小倍数。
结论
该代码实现了图像的缩放操作,通过调用自定义函数 resizeImage
,可以实现图像的放大和缩小。在函数内部,根据目标宽度和高度计算新的尺寸,并使用 cv2.resize
函数对图像进行缩放操作。缩放操作在计算机视觉和图像处理中经常用到,可以用于改变图像的大小、调整图像的分辨率等应用。通过该代码,可以对图像进行自定义倍数的放大和缩小操作,并保存缩放后的图像。
实验6
实验内容
该代码展示了使用 OpenCV 和 NumPy 定义结构元素实现图像膨胀和腐蚀操作的过程。具体实现内容如下:
-
使用
cv2.imread
函数读取名为 “test.jpg” 的灰度图像。 -
调用
cv2.getStructuringElement
函数定义一个 3x3 的矩形结构元素kernel
。 -
使用
cv2.erode
函数对图像进行腐蚀操作,并将结果保存到eroded
中。 -
使用
cv2.imshow
函数展示腐蚀后的图像。 -
使用
cv2.dilate
函数对图像进行膨胀操作,并将结果保存到dilated
中。 -
使用
cv2.imshow
函数展示膨胀后的图像。 -
使用
cv2.imshow
函数展示原始图像。 -
定义一个 3x3 的矩形结构元素
NpKernel
。 -
使用
cv2.erode
函数和NpKernel
对图像进行腐蚀操作,并将结果保存到Nperoded
中。 -
使用
cv2.imshow
函数展示使用 NumPy 定义结构元素腐蚀后的图像。 -
使用
cv2.waitKey
和cv2.destroyAllWindows
函数等待按键输入并关闭窗口。
代码注释
import cv2
import numpy as npimg = cv2.imread('test.jpg',0)
#OpenCV定义的结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))#腐蚀图像
eroded = cv2.erode(img,kernel)
#显示腐蚀后的图像
cv2.imshow("Eroded Image",eroded);#膨胀图像
dilated = cv2.dilate(img,kernel)
#显示膨胀后的图像
cv2.imshow("Dilated Image",dilated);
#原图像
cv2.imshow("Origin", img)#NumPy定义的结构元素
NpKernel = np.uint8(np.ones((3,3)))
Nperoded = cv2.erode(img,NpKernel)
#显示腐蚀后的图像
cv2.imshow("Eroded by NumPy kernel",Nperoded);cv2.waitKey(0)
cv2.destroyAllWindows()
效果演示
Origin
dilated Image
Eroed Image
Eroded by NumPy kernel
功能说明
该代码展示了对图像进行膨胀和腐蚀操作的过程。通过调用 cv2.getStructuringElement
函数定义结构元素,使用 cv2.erode
和 cv2.dilate
函数分别对图像进行腐蚀和膨胀操作,实现了形态学图像处理的基本操作。
同时,该代码也展示了使用 NumPy 定义结构元素的方法,使用 np.ones 函数生成一个结构元素,定义结构元素的形状和尺寸。使用定义好的结构元素进行腐蚀操作,实现了形态学图像处理中使用 NumPy 定义结构元素的方法。
效果分析比较
该代码展示了使用 OpenCV 和 NumPy 定义结构元素进行的图像膨胀和腐蚀操作。可以看到,通过调整结构元素的形状和大小,可以实现不同程度的腐蚀和膨胀效果。
结论
该代码展示了 OpenCV 和 NumPy 定义结构元素进行图像膨胀和腐蚀操作的过程。膨胀和腐蚀操作是形态学图像处理中最基本的操作,通过调整结构元素的形状和大小,可以实现不同程度的腐蚀和膨胀效果。同时,使用 NumPy 定义结构元素的方法也可以实现腐蚀操作,方便对结构元素进行格式的定义。
实验7
实验内容
该代码展示了使用 OpenCV 的形态学运算(闭运算和开运算)对图像进行处理的过程。具体实现内容如下:
-
使用
cv2.imread
函数读取名为 “test.jpg” 的灰度图像。 -
调用
cv2.getStructuringElement
函数定义一个 5x5 的矩形结构元素kernel
。 -
使用
cv2.morphologyEx
函数进行闭运算操作,将膨胀和腐蚀操作依次应用于图像。 -
使用
cv2.imshow
函数展示闭运算后的图像。 -
使用
cv2.morphologyEx
函数进行开运算操作,将腐蚀和膨胀操作依次应用于图像。 -
使用
cv2.imshow
函数展示开运算后的图像。 -
使用
cv2.waitKey
和cv2.destroyAllWindows
函数等待按键输入并关闭窗口。
代码注释
import cv2
import numpy as npimg = cv2.imread('test.jpg',0)
#定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))#闭运算
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
#显示腐蚀后的图像
cv2.imshow("Close",closed);#开运算
opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
#显示腐蚀后的图像
cv2.imshow("Open", opened);cv2.waitKey(0)
cv2.destroyAllWindows()
效果演示
close
open
功能说明
该代码展示了对图像进行闭运算和开运算的过程。闭运算是先腐蚀后膨胀的过程,可以消除小的前景物体、填充小的前景孔洞和连接相邻物体。开运算是先膨胀后腐蚀的过程,可以消除小的背景噪声。通过调整结构元素的形状和大小,可以控制运算的效果。
效果分析比较
该代码展示了使用闭运算和开运算对图像进行形态学处理的过程。闭运算可以使得前景物体更加连续,同时消除小的前景孔洞。开运算可以消除背景噪声。通过调整结构元素的形状和大小,可以控制运算的效果。
结论
该代码展示了使用 OpenCV 的形态学运算进行闭运算和开运算的过程。闭运算可以使得前景物体更加连续,同时消除小的前景孔洞;开运算可以消除背景噪声。通过调整结构元素的形状和大小,可以控制运算的效果,满足图像处理的需求。形态学运算在图像分割、边缘检测、
实验8
实验内容
该代码展示了基于灰度图像和二值图像的顶帽操作、黑帽操作,以及基本梯度和内部/外部梯度的操作。
代码注释
import cv2 as cv
import numpy as npdef hat_gray_demo(image): # 基于灰度图像的顶帽操作gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))dst = cv.morphologyEx(gray, cv.MORPH_TOPHAT, kernel)cimage = np.array(gray.shape, np.uint8)cimage = 120;dst = cv.add(dst, cimage)cv.imshow("tophat_gray", dst)def hat_binary_demo(image): # 基于二值图像的黑帽帽操作gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))dst = cv.morphologyEx(binary, cv.MORPH_BLACKHAT, kernel)cv.imshow("blackhat_binary", dst)def gradient_demo(image): # 基本梯度gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))dst = cv.morphologyEx(binary, cv.MORPH_GRADIENT, kernel)cv.imshow("gradient", dst)def gradient2_demo(image):kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))dm = cv.dilate(image, kernel)em = cv.erode(image, kernel)dst1 = cv.subtract(image, em) # internal gradientdst2 = cv.subtract(dm, image) # external gradientcv.imshow("internal", dst1)cv.imshow("external", dst2)src = cv.imread("test.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
hat_gray_demo(src)
hat_binary_demo(src)
gradient_demo(src)
gradient2_demo(src)
cv.waitKey(0)cv.destroyAllWindows()
效果演示
input image
internal
external
gradient
blackehat_binary
tophat_gray
功能说明
-
hat_gray_demo
函数对输入图像进行灰度顶帽操作。通过将图像转换为灰度图像,然后使用指定的矩形结构元素和顶帽操作实现。最后将顶帽操作的结果与预定义的灰度值相加并展示结果图像。 -
hat_binary_demo
函数对输入图像进行二值黑帽操作。通过将图像转换为灰度图像,使用大津法进行二值化,然后使用指定的矩形结构元素和黑帽操作实现。最后展示黑帽操作的结果图像。 -
gradient_demo
函数对输入图像进行基本梯度操作。通过将图像转换为灰度图像,使用大津法进行二值化,然后使用指定的矩形结构元素和基本梯度操作实现。最后展示基本梯度操作的结果图像。 -
gradient2_demo
函数对输入图像进行内部和外部梯度操作。通过先膨胀再腐蚀和先腐蚀再膨胀两种操作实现。最后展示内部和外部梯度操作的结果图像。
效果分析比较
- 灰度顶帽操作可以突出图像中的细节和微小变化。
- 二值黑帽操作可以突出图像中的小的背景细节和噪声。
- 基本梯度操作可以检测图像中的边缘和轮廓信息。
- 内部和外部梯度操作可以分别提取图像中物体的内部和外部边缘。
结论
该代码展示了基于图像的不同形态学操作,包括顶帽操作、黑帽操作、基本梯度和内部/外部梯度。这些操作可以用于图像增强、边缘检测和特征提取等应用中。通过调整结构元素的形状和大小,可以获得不同程度的效果。