opencv几何变换和图像形态学

实验1

实验内容

该代码演示了如何使用OpenCV库中的WarpAffine函数进行图像基础的仿射变换

代码注释

import numpy as np
import cv2 as cv

img = 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()

效果演示

opencv几何变换和图像形态学_第1张图片

功能说明

该代码使用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 np

img=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几何变换和图像形态学_第2张图片

功能说明

该代码基于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 np

img = 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) - cX
    M[1, 2] += (nH / 2) - cY

    # 执行实际旋转并返回图像
    shuchu = cv2.warpAffine(image, M, (nW, nH))
    while (1):
        cv2.imshow('shuchu', shuchu)
        if cv2.waitKey(1) & 0xFF == 27:
            break


rotate_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 cv

img = 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

opencv几何变换和图像形态学_第3张图片

result

opencv几何变换和图像形态学_第4张图片

功能说明

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

具体步骤如下:

  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 cv2

def 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 newimage

imageOriginal = 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

opencv几何变换和图像形态学_第5张图片

New

opencv几何变换和图像形态学_第6张图片

result

opencv几何变换和图像形态学_第7张图片

功能说明

该代码实现了一个自定义函数 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 np

img = 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

opencv几何变换和图像形态学_第8张图片

dilated Image

opencv几何变换和图像形态学_第9张图片

Eroed Image

opencv几何变换和图像形态学_第10张图片

Eroded by NumPy kernel

opencv几何变换和图像形态学_第11张图片

功能说明

该代码展示了对图像进行膨胀和腐蚀操作的过程。通过调用 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 np

img = 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

opencv几何变换和图像形态学_第12张图片

open

opencv几何变换和图像形态学_第13张图片

功能说明

该代码展示了对图像进行闭运算和开运算的过程。闭运算是先腐蚀后膨胀的过程,可以消除小的前景物体、填充小的前景孔洞和连接相邻物体。开运算是先膨胀后腐蚀的过程,可以消除小的背景噪声。通过调整结构元素的形状和大小,可以控制运算的效果。

效果分析比较

该代码展示了使用闭运算和开运算对图像进行形态学处理的过程。闭运算可以使得前景物体更加连续,同时消除小的前景孔洞。开运算可以消除背景噪声。通过调整结构元素的形状和大小,可以控制运算的效果。

结论

该代码展示了使用 OpenCV 的形态学运算进行闭运算和开运算的过程。闭运算可以使得前景物体更加连续,同时消除小的前景孔洞;开运算可以消除背景噪声。通过调整结构元素的形状和大小,可以控制运算的效果,满足图像处理的需求。形态学运算在图像分割、边缘检测、

实验8

实验内容

该代码展示了基于灰度图像和二值图像的顶帽操作、黑帽操作,以及基本梯度和内部/外部梯度的操作。

代码注释

import cv2 as cv
import numpy as np


def 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 gradient
    dst2 = cv.subtract(dm, image)  # external gradient
    cv.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

opencv几何变换和图像形态学_第14张图片

internal

opencv几何变换和图像形态学_第15张图片

external

opencv几何变换和图像形态学_第16张图片

gradient

opencv几何变换和图像形态学_第17张图片

blackehat_binary

opencv几何变换和图像形态学_第18张图片

tophat_gray

opencv几何变换和图像形态学_第19张图片

功能说明

  • hat_gray_demo 函数对输入图像进行灰度顶帽操作。通过将图像转换为灰度图像,然后使用指定的矩形结构元素和顶帽操作实现。最后将顶帽操作的结果与预定义的灰度值相加并展示结果图像。

  • hat_binary_demo 函数对输入图像进行二值黑帽操作。通过将图像转换为灰度图像,使用大津法进行二值化,然后使用指定的矩形结构元素和黑帽操作实现。最后展示黑帽操作的结果图像。

  • gradient_demo 函数对输入图像进行基本梯度操作。通过将图像转换为灰度图像,使用大津法进行二值化,然后使用指定的矩形结构元素和基本梯度操作实现。最后展示基本梯度操作的结果图像。

  • gradient2_demo 函数对输入图像进行内部和外部梯度操作。通过先膨胀再腐蚀和先腐蚀再膨胀两种操作实现。最后展示内部和外部梯度操作的结果图像。

效果分析比较

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

结论

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

你可能感兴趣的:(opencv,人工智能,计算机视觉)