opencv几何变换和图像形态学

实验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函数实现了一种基础的二维仿射变换技术。具体步骤如下:

  1. 图像读取:使用cv.imread函数读取指定路径下的图像文件,将读取结果存储到img变量。

  2. 图像属性获取:使用ndarray.shape方法获取图片的行、列、通道数量等属性。

  3. 转换矩阵构建:使用numpy库中的float32方法生成一个2x3的转换矩阵(M),并选定x、y轴方向上的偏移量(100个单位和50个单位).

  4. 图像仿射变换:使用cv.warpAffine函数实现图片的仿射变换,该变换是平移变换的一种,可实现对图像的水平、竖直方向上进行偏移。

  5. 图像显示:使用cv.imshow函数对opencv库中所读取的图像进行展示。

  6. 等待按键输入:使用cv.waitKey函数等待按键输入,参数为0表示无限等待。

  7. 关闭窗口:使用cv.destroyAllWindows函数关闭图像显示窗口。

效果分析比较

此代码实现了一种基础的二维仿射变换操作。结果图像相对于原始图像向x轴方向平移100个单位,向y轴方向平移50个单位。相比于原始图像,变换后的图像中心位置向右下方偏移。可以通过对比两张图像,观察到图像位置发生了变化。

结论

该代码演示了如何使用基本图像处理方法对图像进行仿射变换操作。仿射变换是图像处理中常用的基本变换操作之一,可实现对图像的旋转、平移等变换,适用于将图像转换成指定的形状和位置。在OpenCV库中,可通过WarpAffine等函数实现对图像的旋转、平移等仿射操作。

实验2

实验内容

该代码使用OpenCV库中的函数实现了图像的旋转和缩放操作。具体实验内容如下:

  1. 读取名为 “test.jpg” 的图像。

  2. 获取图像的行数和列数。

  3. 创建旋转矩阵 M,将图像绕图像中心旋转60度,并进行1.2倍的缩放。

  4. 使用 cv2.warpAffine 进行图像的旋转和缩放操作。

  5. 使用 cv2.imshow 展示旋转和缩放后的图像。

  6. 通过 cv2.waitKeycv2.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 对图像进行了旋转和缩放操作。主要步骤如下:

  1. 图像读取:使用 cv2.imread 函数读取名为 “test.jpg” 的图像。

  2. 获取图像属性:通过提取图像的行数和列数,获取图像的尺寸。

  3. 旋转矩阵创建:使用 cv2.getRotationMatrix2D 创建旋转矩阵 M。在该例中,以图像中心为中心点,旋转60度,并缩放1.2倍。

  4. 图像旋转和缩放:使用 cv2.warpAffine 对原始图像进行旋转和缩放操作。

  5. 图像展示:使用 cv2.imshow 展示旋转和缩放后的图像。

  6. 循环展示:通过 cv2.waitKey 函数循环展示旋转后的图像,若按下 ESC 键(ASCII码为27),则关闭图像展示。

  7. 关闭窗口:使用 cv2.destroyAllWindows 关闭图像展示窗口。

效果分析比较

该代码实现了图像的旋转和缩放操作。旋转后的图像通过旋转中心、旋转角度和缩放因子的调整,使得图像发生了旋转并保持了一定的尺寸。

结论

此代码演示了如何使用OpenCV对图像进行旋转和缩放操作。通过旋转矩阵的设定,可以对图像进行不同程度和方式的旋转,并通过缩放因子调整图像的尺寸。这种操作在图像处理和计算机视觉中很常见,可用于各种应用场景,如图像增强、目标检测、图像配准等。

指令

实验3

实验内容

该代码实现了一个自定义函数,用于对图像进行旋转操作。具体实现内容如下:

  1. 读取名为 “test.jpg” 的图像。

  2. 定义一个名为 rotate_bound 的函数,接受两个参数:图像和旋转角度。

  3. 在函数内部,获取图像的尺寸以及图像中心点的坐标。

  4. 利用 cv2.getRotationMatrix2D 获取旋转矩阵 M,应用负值的旋转角度。

  5. 计算图像的新边界尺寸,根据旋转矩阵的旋转分量(正弦和余弦)。

  6. 调整旋转矩阵以考虑平移,并添加到 M 中。

  7. 使用 cv2.warpAffine 对图像进行实际旋转,并返回旋转后的图像。

  8. 使用 cv2.imshow 循环展示旋转后的图像。

  9. 使用 cv2.waitKeycv2.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 对图像进行旋转。

具体步骤如下:

  1. 图像读取:使用 cv2.imread 函数读取名为 “test.jpg” 的图像。

  2. 函数定义:定义函数 rotate_bound,接受两个参数:图像和旋转角度。

  3. 图像尺寸和中心点计算:在函数内部,使用 image.shape[:2] 获取图像的尺寸,并计算图像中心点的坐标。

  4. 旋转矩阵获取:使用 cv2.getRotationMatrix2D 获取旋转矩阵 M,将图像中心点作为旋转的参考点,应用负值的旋转角度。

  5. 新边界尺寸计算:根据旋转矩阵的旋转分量(正弦和余弦),计算图像的新边界尺寸。

  6. 平移调整:调整旋转矩阵以考虑平移,并添加到 M 中。

  7. 图像旋转:使用 cv2.warpAffine 对图像进行实际旋转,并返回旋转后的图像。

  8. 图像展示:使用 cv2.imshow 循环展示旋转后的图像。

  9. 等待按键输入:使用 cv2.waitKey 函数等待按键输入,参数为1表示等待1毫秒,若按下 ESC 键(ASCII码为27),则退出循环。

  10. 关闭窗口:使用 cv2.destroyAllWindows 关闭图像展示窗口。

效果分析比较

该代码实现了图像的旋转操作。传入的参数是图像和旋转角度,函数内部根据图像尺寸和旋转角度计算旋转矩阵和新的边界尺寸,并通过 cv2.warpAffine 对图像进行旋转操作。

结论

该代码实现了一个自定义函数,用于对图像进行旋转操作。函数通过获取图像的尺寸和中心点,计算旋转矩阵和新的边界尺寸,并应用于图像,实现图像的旋转操作。旋转操作在计算机视觉和图像处理中经常用到,可用于目标检测、图像配准、特征提取等应用。

实验4

实验内容

该代码实现了图像的仿射变换操作,将一个三角形的区域映射到另一个三角形的区域。具体实现内容如下:

  1. 读取名为 “test.jpg” 的图像。

  2. 定义一个名为 p1 的二维数组,包含原始三角形的三个顶点的坐标。

  3. 定义一个名为 p2 的二维数组,包含目标三角形的三个顶点的坐标。

  4. 使用 cv.getAffineTransform 函数获取仿射变换矩阵 M,输入参数为 p1p2

  5. 使用 cv.warpAffine 函数对图像进行仿射变换,输入参数为图像、仿射变换矩阵和输出图像的尺寸。

  6. 使用 cv.imshow 函数展示原始图像和变换后的图像。

  7. 使用 cv.waitKeycv.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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

功能说明

该代码实现了图像的仿射变换操作,将一个三角形的区域映射到另一个三角形的区域。

具体步骤如下:

  1. 图像读取:使用 cv.imread 函数读取名为 “test.jpg” 的彩色图像。

  2. 三角形定义:定义二维数组 p1p2,分别表示原始三角形和目标三角形的三个顶点的坐标。

  3. 仿射变换矩阵获取:使用 cv.getAffineTransform 函数获取仿射变换矩阵 M,输入参数为 p1p2

  4. 图像仿射变换:使用 cv.warpAffine 函数对图像进行仿射变换,输入参数为图像、仿射变换矩阵 M 和输出图像的尺寸。

  5. 图像展示:使用 cv.imshow 展示原始图像和变换后的图像。

  6. 等待按键输入:使用 cv.waitKey(0) 函数等待按键输入,参数为0表示无限等待,直到按下任意键。

  7. 关闭窗口:使用 cv.destroyAllWindows 关闭图像展示窗口。

效果分析比较

该代码实现了图像的仿射变换操作。通过定义原始三角形和目标三角形的顶点,计算仿射变换矩阵,并使用 cv.warpAffine 函数对图像进行仿射变换。

结论

该代码实现了图像的仿射变换操作,将一个三角形的区域映射到另一个三角形的区域。仿射变换在计算机视觉和图像处理中经常用到,可用于图像的转换、纠正、拉伸等操作。本代码通过定义原始三角形和目标三角形的顶点,并利用仿射变换矩阵对图像进行变换,实现了图像的仿射变换操作。

实验5

实验内容

该代码实现了图像的缩放操作,包括放大和缩小。具体实现内容如下:

  1. 定义了一个名为 resizeImage 的函数,接受图像、目标宽度、目标高度和插值方法作为参数。

  2. 在函数内部,首先根据目标宽度和高度计算新的尺寸。

  3. 然后根据图像的原始尺寸和目标尺寸的关系,选择高度缩放或宽度缩放。

  4. 最后使用 cv2.resize 函数对图像进行缩放操作,并返回缩放后的图像。

  5. 在主程序中,首先读取名为 “lakeWater.jpg” 的图像,并展示原始图像。

  6. 通过调用 resizeImage 函数对图像进行放大操作,放大倍数为2倍,并展示放大后的图像。

  7. 使用 cv2.imwrite 函数保存放大后的图像。

  8. 再次调用 resizeImage 函数对图像进行缩小操作,缩小倍数为5倍,并保存缩小后的图像。

  9. 使用 cv2.imshow 展示缩小后的图像,并等待按键输入。

  10. 使用 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 定义结构元素实现图像膨胀和腐蚀操作的过程。具体实现内容如下:

  1. 使用 cv2.imread 函数读取名为 “test.jpg” 的灰度图像。

  2. 调用 cv2.getStructuringElement 函数定义一个 3x3 的矩形结构元素 kernel

  3. 使用 cv2.erode 函数对图像进行腐蚀操作,并将结果保存到 eroded 中。

  4. 使用 cv2.imshow 函数展示腐蚀后的图像。

  5. 使用 cv2.dilate 函数对图像进行膨胀操作,并将结果保存到 dilated 中。

  6. 使用 cv2.imshow 函数展示膨胀后的图像。

  7. 使用 cv2.imshow 函数展示原始图像。

  8. 定义一个 3x3 的矩形结构元素 NpKernel

  9. 使用 cv2.erode 函数和 NpKernel 对图像进行腐蚀操作,并将结果保存到 Nperoded 中。

  10. 使用 cv2.imshow 函数展示使用 NumPy 定义结构元素腐蚀后的图像。

  11. 使用 cv2.waitKeycv2.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.erodecv2.dilate 函数分别对图像进行腐蚀和膨胀操作,实现了形态学图像处理的基本操作。

同时,该代码也展示了使用 NumPy 定义结构元素的方法,使用 np.ones 函数生成一个结构元素,定义结构元素的形状和尺寸。使用定义好的结构元素进行腐蚀操作,实现了形态学图像处理中使用 NumPy 定义结构元素的方法。

效果分析比较

该代码展示了使用 OpenCV 和 NumPy 定义结构元素进行的图像膨胀和腐蚀操作。可以看到,通过调整结构元素的形状和大小,可以实现不同程度的腐蚀和膨胀效果。

结论

该代码展示了 OpenCV 和 NumPy 定义结构元素进行图像膨胀和腐蚀操作的过程。膨胀和腐蚀操作是形态学图像处理中最基本的操作,通过调整结构元素的形状和大小,可以实现不同程度的腐蚀和膨胀效果。同时,使用 NumPy 定义结构元素的方法也可以实现腐蚀操作,方便对结构元素进行格式的定义。

实验7

实验内容

该代码展示了使用 OpenCV 的形态学运算(闭运算和开运算)对图像进行处理的过程。具体实现内容如下:

  1. 使用 cv2.imread 函数读取名为 “test.jpg” 的灰度图像。

  2. 调用 cv2.getStructuringElement 函数定义一个 5x5 的矩形结构元素 kernel

  3. 使用 cv2.morphologyEx 函数进行闭运算操作,将膨胀和腐蚀操作依次应用于图像。

  4. 使用 cv2.imshow 函数展示闭运算后的图像。

  5. 使用 cv2.morphologyEx 函数进行开运算操作,将腐蚀和膨胀操作依次应用于图像。

  6. 使用 cv2.imshow 函数展示开运算后的图像。

  7. 使用 cv2.waitKeycv2.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 函数对输入图像进行内部和外部梯度操作。通过先膨胀再腐蚀和先腐蚀再膨胀两种操作实现。最后展示内部和外部梯度操作的结果图像。

效果分析比较

  • 灰度顶帽操作可以突出图像中的细节和微小变化。
  • 二值黑帽操作可以突出图像中的小的背景细节和噪声。
  • 基本梯度操作可以检测图像中的边缘和轮廓信息。
  • 内部和外部梯度操作可以分别提取图像中物体的内部和外部边缘。

结论

该代码展示了基于图像的不同形态学操作,包括顶帽操作、黑帽操作、基本梯度和内部/外部梯度。这些操作可以用于图像增强、边缘检测和特征提取等应用中。通过调整结构元素的形状和大小,可以获得不同程度的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微信小程序】上传头像 微信小程序内接小程序客服

这里写目录标题 微信小程序上传头像使用button按钮包裹img 微信小程序内接小程序客服使用button按钮跳转客服 微信小程序上传头像 使用button按钮包裹img 原本思路是只使用image标签再加上chooseImg,但发现使用button标签上传头像这种方法更实用。微信小程序文档上…

C++实现DFS、BFS、Kruskal算法和Prim算法、拓扑排序、Dijkstra算法

背景: 实现要求: 根据图的抽象数据类型的定义,请采用邻接矩阵来存储图1,采用邻接表来存储图2,并完成如下操作:对图1无向图进行深度优先遍历和广度优先遍历。对图1无向图采用Kruskal算法和Prim算法得出最小…

如何保持高能量

精力管理 精力管理对于平衡多项任务和保持热情至关重要。 通过自我积极反馈循环系统培养积极的内心声音。 培养仪式和习惯来控制内心的声音并保持能量。 学习语言带来正能量和宝贵的技能 保持高能量需要自我赋权和体力充电。 经常锻炼有很多好处,包括改善健康…

BLIP和BLIP2

1.BLIP BLIP的第一个共享是将图像文本理解与图像文本生成任务进行了统一,形成了多模态统一模型,模型在ITC任务上的效果也比CLIP更好。 1.1任务 ITC:就是CLIP中的图像文本对比学习任务 ITM:针对ITC任务中匹配不正确的样本&#…

FreeRtos第一个task是怎么run起来的

第一个task是怎么起来的呢?分析完vTaskStartScheduler,就会有答案了。 那vTaskStartScheduler()干了啥呢? 一、创建prvIdleTask task 二、xTimerCreateTimerTask里创建prvTimerTask task 三、初始化一些全局变量 3.1 xNextTaskUnblockTime…

业务数据治理体系化实施流程学习总结

目录 一、业务数据治理实施流程 步骤 1:发现问题和制定目标 步骤 2:针对问题进行拆解,设计可衡量的指标 步骤 3:制定解决SOP和检查研发标准规范 步骤 4:推广运营,以拿结果为核心目标 步骤 5&#xff…

navicat某些表为什么不按主键排序

不知道大家注没注意过navicat的这种情况 为什么不是按主键排序呢 我们来全表扫描看下他的执行计划 explain select * from orsql3; 可以发现不是全表扫描而是索引树扫描,由此得知了共性,不按主键顺序排序的表,肯定是在二级索引上就保存着全部…

计算机网络体系的形成

目录 1、开放系统互连参考模型OSI/RM 2、两种国际标准 3、协议与划分层次 4、网络协议的三要素 5、划分层次 (1)文件发送模块使两个主机交换文件 (2)通信服务模块 (3)接入网络模块 6、分层带来的好…

pytorch 模型量化quantization

pytorch 模型量化quantization 1.workflow1.1 PTQ1.2 QAT 2. demo2.1 构建resnet101_quantization模型2.2 PTQ2.3 QAT 参考文献 pytorch框架提供了三种量化方法,包括: Dynamic QuantizationPost-Training Static Quantization(PTQ&#xff0…

随心玩玩(十)git

写在前面:研究生一年多了,一直浑浑噩噩的,在深度学习的泥潭挣扎了好久,终于走出了精神内耗的泥潭…好久没有写博客了,决定重新捡起来…记录一下学习吧~ 之前写了一篇git的博客,【github 从0开始的基本操作…

Ubuntu 22.04安装mysql-server 8.0.34(使用bundle.tar)

《Ubuntu 20.04 使用mysql-server_8.0.31-1ubuntu20.04_amd64.deb-bundle.tar安装MySQL 8.0.31》是我以前写的博客。 https://downloads.mysql.com/archives/community/是社区版的官网,可以选择版本下载。 sudo wget -c https://downloads.mysql.com/archives/ge…

【数据库原理】函数依赖、三范式、视图、事务、数据库设计(概念、逻辑、物理结构设计,实施)、数据流图、数据字典、存储过程、触发器、备份与还原【我统统拿下!】

函数依赖 函数依赖是关系数据库中的重要概念,用于描述关系中属性之间的依赖关系。 在关系数据库中,如果关系 R 中的某个属性或属性组的值能够唯一确定关系中其他属性的值,那么我们就说这个属性或属性组对其他属性具有函数依赖关系。 举个例…

分享84个节日PPT,总有一款适合您

分享84个节日PPT,总有一款适合您 84个节日PPT下载链接:https://pan.baidu.com/s/1TSIGR8ZIytnTKmQRa0rGnw?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易…

ADC欠采样以及应用案例

欠采样与其优劣 ADC(Analog-to-Digital Converter)的欠采样是指在信号的采样过程中,采样频率低于被采样信号的最高频率的情况。这意味着采样率不足以捕捉到信号的完整信息,而是以较低的频率对信号进行采样。 欠采样在某些特定情…

使用Java语言实现变量互换

一、 java运算 通过异或运算符实现两个变量的互换 import java.util.Scanner;public class ExchangeValueDemo {public static void main(String[] args){try (Scanner scan new Scanner(System.in)) {System.out.println("请输入A的值:");long A sca…

分割YooChoose数据集为YooChoose1/4、YooChoose1/64

目的 源YooChoose数据集十分庞大,有上千万级别的数据,在测试验证模型性能时加载起来十分费劲。 脚本思路 使用数据集中session_id作为滤网对源数据进行过滤,过滤出2百万个不同的session_id作为训练集。 具体步骤 (1)…

TA-Lib学习研究笔记(二)——Overlap Studies上

TA-Lib学习研究笔记(二)——Overlap Studies 1. Overlap Studies 指标 [BBANDS, DEMA, EMA, HT_TRENDLINE, KAMA, MA, MAMA, MAVP, MIDPOINT, MIDPRICE, SAR, SAREXT, SMA, T3, TEMA, TRIMA, WMA]2.数据准备 get_data函数参数(代码&#x…

javaee实验:文件上传及截器的使用

目录 文件上传ModelAttribute注解实验目的实验内容实验过程项目结构编写代码结果展示 文件上传 Spring MVC 提供 MultipartFile 接口作为参数来处理文件上传。 MultipartFile 提供以下方法来获取上传的文件信息:  getOriginalFilename 获取上传的文件名字&#x…

HttpRunner自动化测试之响应中文乱码处理

响应中文乱码: 当调用接口,响应正文返回的中文是乱码时,一般是响应正文的编码格式不为 utf-8 导致,此时需要根据实际的编码格式处理 示例: 图1中 extract 提取title标题,output 输出 title 变量值&#x…

【Unity动画】状态机中层的融合原理与用法详解

1. 状态机概念介绍 在Unity中,动画状态机(Animator State Machine)是一种强大的工具,用于控制游戏对象的动画行为。动画状态机由多个动画状态Animation和过渡条件Transition、层组成!而层(Layers&#xff…