《计算机视觉》课题习题和思考题答案_第1页
《计算机视觉》课题习题和思考题答案_第2页
《计算机视觉》课题习题和思考题答案_第3页
《计算机视觉》课题习题和思考题答案_第4页
《计算机视觉》课题习题和思考题答案_第5页
已阅读5页,还剩19页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课题习题和思考题答案模块一走进计算机视觉一、思考题答案1.计算机视觉技术具有很多优势,实现了“人工智能+”的诸多功能,方便了我们的生活。请简述你身边的关于计算机视觉的应用案例?答案:举例说明,不限于以下答案:计算机视觉技术在我们的日常生活中有着广泛的应用。以下是一些我身边的关于计算机视觉的应用案例:(1)人脸识别系统:在公共场所,如机场、火车站或大型购物中心,人脸识别系统已经被广泛应用。通过捕捉和分析人脸特征,这些系统可以快速准确地识别出个体,提高安全性和效率。(2)智能安防监控:许多社区和办公大楼都安装了智能安防监控系统,利用计算机视觉技术对监控视频进行实时分析。系统能够检测异常行为,如入侵者、打斗等,并自动发出警报,大大提高了安全性。(3)自动驾驶汽车:自动驾驶汽车是计算机视觉技术的重要应用之一。通过摄像头和传感器捕捉周围环境信息,结合计算机视觉算法进行路况分析和目标识别,自动驾驶汽车能够在无需人工干预的情况下自主行驶。(4)智能零售:在零售商店中,计算机视觉技术可以帮助商家进行客流分析、商品陈列优化等工作。通过分析顾客的购物行为和习惯,商家可以制定更精准的营销策略,提高销售额。(5)医学影像分析:在医疗领域,计算机视觉技术也被广泛应用于医学影像分析。医生可以利用这些技术快速准确地识别出病变部位和类型,为诊断和治疗提供有力支持。这些只是计算机视觉技术在我们身边的部分应用案例,实际上,随着技术的不断发展,计算机视觉将在更多领域发挥重要作用,为我们的生活带来便利和效率。二、课后习题答案1.单选题BADA2.判断题√×√×√3.简答题(1)什么是计算机视觉?答案:计算机视觉(ComputerVision)是人工智能的一个领域,是指让计算机和系统能够从图像、视频和其他视觉输入中获取有意义的信息,并根据该信息采取行动或提供建议。人工智能赋予计算机思考的能力,计算机视觉就是赋予发现、观察和理解的能力。(2)简述计算机视觉的主要应用领域有哪些?答案:计算机视觉应用非常广泛,可以分为以下几大方向:图像分类目标检测图像分割风格迁移图像重构超分辨率图像生成人脸应用简述计算机视觉的发展趋势,并举例说明其中一个趋势在现实生活中的应用。答案:深度学习技术的广泛应用深度学习在计算机视觉中发挥着越来越重要的作用。通过构建多层神经网络,深度学习可以实现对图像和视频数据的自动特征提取和分类,从而提高计算机视觉系统的准确性和鲁棒性。未来,深度学习算法将继续优化,推动计算机视觉技术的进一步发展。多模态视觉处理传统的计算机视觉主要关注对单一模态的处理,如图像或视频。然而,现实世界中存在多种感知模态,如视觉、声音、触觉等。未来的计算机视觉系统将会尝试集成多种感知模态,以提供更全面的信息处理能力。这种多模态视觉处理将有助于提高计算机视觉系统的性能和准确性。实时性和高效率随着硬件设备的不断升级和网络技术的进步,计算机视觉系统的实时性和高效率成为越来越重要的需求。未来的计算机视觉系统将更加注重实时性能,能够在短时间内处理大量的图像和视频数据,并给出准确的结果。数据隐私和安全性的重视随着计算机视觉应用的广泛普及,数据隐私和安全问题也日益凸显。未来的计算机视觉系统将更加注重数据的隐私保护和安全性,加强数据管理和权限控制,以确保用户数据的安全。行业应用的不断拓展计算机视觉技术在各个领域都有广泛的应用前景,如安防、工业、医疗、零售等。未来,随着技术的不断进步和应用需求的不断变化,计算机视觉技术将在更多行业中得到应举例来说,健康和安全领域的应用是一个重要的趋势。科学家已经开发出利用计算机视觉技术来检测建筑工地上的不安全行为,以及在新冠疫情期间通过寻找感染证据和肺部图像受损情况来帮助诊断患者的病情。这些应用不仅提高了安全性和效率,也展示了计算机视觉在现实生活中的广泛应用前景。模块二OpenCV基本操作一、思考题答案1.描述在使用OpenCV通过摄像头拍摄图像和视频时,可能会遇到哪些问题,以及如何解决这些问题?答案:摄像头未正确连接或无法识别:确保摄像头已正确连接到计算机,并检查驱动程序是否已正确安装。捕获的图像质量不佳:可以通过调整摄像头的分辨率、曝光度等参数来优化图像质量。视频录制过程中出现卡顿或延迟:这可能是由于计算机性能不足或摄像头性能不佳导致的。可以尝试降低视频的分辨率或帧率来减少资源占用,或者升级计算机硬件。录制的视频文件无法保存或格式不正确:确保指定了正确的文件路径和格式,并检查磁盘空间是否充足。二、课后习题答案1.单选题AABC2.判读题×√××√×3.填空题(1)cv2.imread()(2)cv2.imshow()(3)None(4)0(5)ret(6)cv2.VideoWriter()4.编程题(1)以灰度方式读取磁盘上的图像并显示,按下ESC键时,退出图像显示,释放窗口。#模块二

课后习题编程题1

import

cv2

#

读取图像,并将其转换为灰度图像

gray_image

=

cv2.imread("dog.png",

cv2.IMREAD_GRAYSCALE)

#

检查图像是否正确读取

if

gray_image

is

None:

print("Error:

Could

not

read

the

image.")

else:

#

创建窗口并显示图像

cv2.imshow('Gray

Image',

gray_image)

#

等待键盘输入,如果按下ESC键则退出循环

key

=

cv2.waitKey(0)

if

key

==

27:

#

ESC键的ASCII码是27

print("Exit

successfully")

cv2.destroyAllWindows()

#

释放所有OpenCV创建的窗口

(2)读取本地视频,按下s键时,将当前视频界面保存成jpg格式的图像,按下q键时退出。#模块二

编程题2

import

cv2

cap

=

cv2.VideoCapture('test.avi')

if

not

cap.isOpened():

print("无法打开视频文件")

exit()

while

cap.isOpened():

ret,

frame

=

cap.read()

if

not

ret:

#

如果读取不到帧(视频已播放完毕),则退出循环

break

cv2.imshow('frame',

frame)

if

cv2.waitKey(25)

&

0xFF

==

ord('s'):

cv2.imwrite('d:/frame.jpg',

frame)

if

cv2.waitKey(25)

&

0xFF

==

ord('q'):

break

cap.release()

cv2.destroyAllWindows()

模块三图像的基本运算一、思考题答案1.cv2.addWeighted()函数的各个参数的具体作用。答案:cv2.addWeighted是OpenCV中的一个函数,用于将两幅图像进行加权求和。使用方法:cv2.addWeighted(src1,alpha,src2,beta,gamma,dst)src1:第一幅图像alpha:第一幅图像的权重(取值范围为0到1)src2:第二幅图像beta:第二幅图像的权重(取值范围为0到1)gamma:求和后的偏移量dst:输出图像2.从密码学角度来看,图像数据的加密与文本信息数据加密是相同的,就是把图像数据信息转换为不可以辨识的形式的过程。常见的图像加密技术有哪些?如何通过图像加密技术提升图像加密的性能,使非授权接收方通过非常途径截获加密图像后也不能识别和解密。答案:(1)基于像素位置变换的加密技术(2)基于随机序列的加密技术(3)基于压缩编码的加密技术3.数字水印是一种信息隐藏技术,它利用人体感官的限制,将数字信号,如图像、文字、符号、数字等一切可以作为标记、标识的信息与原始数据(如图像、音频、视频数据)紧密结合并隐藏其中,并可以经历一些不破坏源数据价值的操作而能保存下来。如何将含水印图像去水印?答案:删除含水印图像中的水印就是将含水印图像中的最低位置零。具体操作过程是:用全部像素值为254(11111110)的提取矩阵与含水印图像进行按位与运算。就是保留含水印图像的高7位,最低位置0。二、课后习题答案1.单选题(2)C(2)C(3)B2.多选题(1)ABCD(2)AC3.填空题(1)加法运算位运算(2)像素值(3)按位与运算(4)按位或运算(5)按位非运算模块四图像变换一、思考题答案1.cv2.flip(filename,flipcode)函数的各个参数的具体作用。答案:filename表示需要操作的图像,flipcode表示翻转方式,若为1则表示水平翻转,若为0则表示垂直翻转,若为-1则表示水平垂直翻转。2.cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)函数的各个参数的具体作用。答案:cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)将原始图像调整为指定大小。各参数释义:scr:原始图像dsize:输出图像的尺寸(元组方式)dst:输出图像fx:沿水平轴缩放的比例因子fy:沿垂直轴缩放的比例因子interpolation:插值方法,有以下5种:3.cv2.warpAffine()函数的各个参数的具体作用。答案:cv2.warpAffine()放射变换函数,可实现旋转,平移,缩放;变换后的平行线依旧平行cv2.warpAffine(src,M,dsize,dst=None,flags=None,borderMode=None,borderValue=None)-->dstsrc:输入图像dst:输出图像M:2×3的变换矩阵dsize:变换后输出图像尺寸flag:插值方法borderMode:边界像素外扩方式borderValue:边界像素插值,默认用0填充4.常见的色彩空间转换方法答案:(1)RGB到灰度(Grayscale):将彩色图像转换为灰度图像。这可以通过取RGB通道的平均值或者使用特定的权重进行转换来实现。(2)RGB到HSV:将RGB色彩空间转换为HSV色彩空间。这种转换使得色相、饱和度和明度的调整更加直观。(3)RGB到CMYK:将RGB色彩空间转换为CMYK色彩空间,通常用于印刷。CMYK表示青、品红、黄和黑。(4)HSV到RGB:将HSV色彩空间转换回RGB色彩空间。这在进行色彩修正或合成不同效果的图像时很有用。(5)YUV转换:将RGB转换为YUV色彩空间,其中Y表示亮度,U和V表示色度。这在数字视频编码中常被使用。(6)Lab色彩空间:CIELab色彩空间是一种基于人眼视觉感知的色彩模型,它分为亮度(L)和两个色度通道(a和b)。二、课后习题答案1.填空题(1)8(2)色调饱和度亮度(3)色调明度饱和度(4)均匀(5)HSV2.判断题√××√√3.编程题(1)对图像进行颜色通道分离与合并。import

cv2

import

numpy

as

np

img

=

cv2.imread(r"D:\Others\Docs\picture\clothes.jpg")

B,G,R

=

cv2.split(img)

zeros

=

np.zeros(img.shape[:2],dtype="uint8")

cv2.imshow("BLUE",cv2.merge([B,zeros,zeros]))

cv2.imshow("GREEN",cv2.merge([zeros,G,zeros]))

cv2.imshow("RED",cv2.merge([zeros,zeros,R]))

cv2.imshow("MERGE",cv2.merge([B,G,R]))

cv2.waitKey(0)

(2)筛选图片中特定颜色。提示:使用inRange(src,lowerb,upperb)判断图像内像素点像素值是否在范围内。import

cv2

import

numpy

as

np

opencv

=

cv2.imread(r"D:\Others\Docs\picture\clothes.jpg")

hsv

=

cv2.cvtColor(opencv,

cv2.COLOR_BGR2HSV)

cv2.imshow("opencv",

opencv)

#

提取蓝色区域

minBlue

=

np.array([110,

50,

50])

maxBlue

=

np.array([130,

255,

255])

mask

=

cv2.inRange(hsv,

minBlue,

maxBlue)

blue

=

cv2.bitwise_and(opencv,

opencv,

mask=mask)

cv2.imshow("blue",

blue)

#

提取绿色区域

minGreen

=

np.array([50,

50,

50])

maxGreen

=

np.array([70,

255,

255])

mask

=

cv2.inRange(hsv,

minGreen,

maxGreen)

green

=

cv2.bitwise_and(opencv,

opencv,

mask=mask)

cv2.imshow("green",

green)

#

提取红色区域

minRed

=

np.array([0,

50,

50])

maxRed

=

np.array([30,

255,

255])

mask

=

cv2.inRange(hsv,

minRed,

maxRed)

red

=

cv2.bitwise_and(opencv,

opencv,

mask=mask)

cv2.imshow("red",

red)

cv2.waitKey()

cv2.destroyAllWindows()

模块五形态学操作一、思考题答案1.图像的腐蚀与膨胀的区别。答案:腐蚀和膨胀是对白色部分而言的。膨胀是对图像中高亮的部分进行膨胀,处理后的图片高亮区域扩大;而腐蚀是对高亮部分进行腐蚀,处理后的图片高亮区域减少。膨胀就是求局部最大值的操作。膨胀与膨胀操作就是将图像与核进行卷积。2.图像开运算与图像闭运算的基本原理。答案:图像开运算是图像依次经过腐蚀、膨胀处理后的过程。图像被腐蚀后,去除了噪声,但是也压缩了图像;接着对腐蚀过的图像进行膨胀处理,可以去除噪声,并保留原有图像。图像闭运算是图像依次经过膨胀、腐蚀处理后的过程。图像先膨胀,后腐蚀,它有助于关闭前景物体内部的小孔,或物体上的小黑点。3.图像礼帽黑帽运算的区别。答案:礼帽运算:开运算可以消除暗背景下的高亮区域,用原图减去开运算结果就可以得到原图中灰度较亮的区域,所以又称白顶帽变换。黑帽运算:闭运算可以删除亮背景下的黑暗区域,用原图减去闭运算结果就可以得到原图中灰度较暗的区域,所以又称黑底帽变换。礼帽运算=原始输入-开运算结果(先腐蚀再膨胀)黑帽运算=闭运算结果(先膨胀再腐蚀)-原始输入tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)scr:表示需要处理的图像cv2.MORPH_TOPHAT:礼帽运算cv2.MORPH_BLACKHAT:黑帽运算kernel:卷积核二、课后习题答案1.单选题(1)D(2)A2.填空题(1)原始图像(2)开运算图像(3)腐蚀(4)膨胀操作3.编程题(1)形态学梯度。完成二值化后,就可以确定形态学梯度了。形态学梯度是一种提取物体边界的技术,通过取形态学膨胀的图像和收缩图像之间的差异。import

cv2

import

numpy

as

np

import

matplotlib.pyplot

as

plt

#

Gray

scale

def

BGR2GRAY(img):

b

=

img[:,

:,

0].copy()

g

=

img[:,

:,

1].copy()

r

=

img[:,

:,

2].copy()

#

Gray

scale

out

=

0.2126

*

r

+

0.7152

*

g

+

0.0722

*

b

out

=

out.astype(np.uint8)

return

out

#

Otsu

Binalization

def

otsu_binarization(img,

th=128):

H,

W

=

img.shape

out

=

img.copy()

max_sigma

=

0

max_t

=

0

#

determine

threshold

for

_t

in

range(1,

255):

v0

=

out[np.where(out

<

_t)]

m0

=

np.mean(v0)

if

len(v0)

>

0

else

0.

w0

=

len(v0)

/

(H

*

W)

v1

=

out[np.where(out

>=

_t)]

m1

=

np.mean(v1)

if

len(v1)

>

0

else

0.

w1

=

len(v1)

/

(H

*

W)

sigma

=

w0

*

w1

*

((m0

-

m1)

**

2)

if

sigma

>

max_sigma:

max_sigma

=

sigma

max_t

=

_t

#

Binarization

print("threshold

>>",

max_t)

th

=

max_t

out[out

<

th]

=

0

out[out

>=

th]

=

255

return

out

#

Erosion

def

Erode(img,

Erode_time=1):

H,

W

=

img.shape

out

=

img.copy()

#

kernel

MF

=

np.array(((0,

1,

0),

(1,

0,

1),

(0,

1,

0)),

dtype=)

#

each

erode

for

i

in

range(Erode_time):

tmp

=

np.pad(out,

(1,

1),

'edge')

#

erode

for

y

in

range(1,

H+1):

for

x

in

range(1,

W+1):

if

np.sum(MF

*

tmp[y-1:y+2,

x-1:x+2])

<

255*4:

out[y-1,

x-1]

=

0

return

out

#

Dilation

def

Dilate(img,

Dil_time=1):

H,

W

=

img.shape

#

kernel

MF

=

np.array(((0,

1,

0),

(1,

0,

1),

(0,

1,

0)),

dtype=)

#

each

dilate

time

out

=

img.copy()

for

i

in

range(Dil_time):

tmp

=

np.pad(out,

(1,

1),

'edge')

for

y

in

range(1,

H+1):

for

x

in

range(1,

W+1):

if

np.sum(MF

*

tmp[y-1:y+2,

x-1:x+2])

>=

255:

out[y-1,

x-1]

=

255

return

out

#

Read

image

img

=

cv2.imread("imori.jpg").astype(np.float32)

#

Grayscale

gray

=

BGR2GRAY(img)

#

Otsu's

binarization

otsu

=

otsu_binarization(gray)

#

Erode

image

eroded

=

Erode(otsu)

#

Delate

image

dilated

=

Dilate(otsu)

#

Morphology

out

=

np.abs(eroded

-

dilated)

*

255

#

Save

result

cv2.imwrite("out.jpg",

out)

cv2.imshow("result",

out)

cv2.waitKey(0)

cv2.destroyAllWindows()

模块六图像平滑处理思考题答案锐化滤波器通常用于增强图像的边缘和细节,使图像看起来更加清晰。请根据自定义滤波的原理,设计一个锐化滤波器,将其应用于一张图像,观察锐化效果。(提示:要设计一个锐化滤波器,我们可以使用一种称为拉普拉斯滤波的方法。拉普拉斯滤波器是一种二阶导数滤波器,它可以强调图像中的快速变化区域,从而实现锐化效果。)import

cv2

as

cv

import

numpy

as

np

import

matplotlib.pyplot

as

plt

#

读取图像

img

=

cv.imread('test.jpg',

cv.IMREAD_GRAYSCALE)

#

定义拉普拉斯锐化滤波器的卷积核

#

这里我们使用3x3的拉普拉斯滤波器

kernel

=

np.array([[0,

-1,

0],

[-1,

4,

-1],

[0,

-1,

0]],

np.float32)

#

应用自定义锐化滤波器

sharp_img

=

cv.filter2D(img,

-1,

kernel)

#

为了更好地观察锐化效果,我们可以将原始图像和锐化后的图像进行叠加

#

这里我们使用简单的加权叠加方式

sharpened_img

=

cv.addWeighted(img,

1.5,

sharp_img,

-0.5,

0)

#

显示原图和锐化后的图像

titles

=

['Original

Image',

'Laplacian

Sharpened

Image']

images

=

[img,

sharpened_img]

for

i

in

range(2):

plt.subplot(1,

2,

i

+

1),

plt.imshow(images[i],

'gray')

plt.title(titles[i])

plt.xticks([]),

plt.yticks([])

plt.show()二、课后习题答案1.单项选择题BBBA2.填空题(1)平均值(2)d(直径)、sigmaColor(颜色空间滤波器的标准差)、sigmaSpace(坐标空间滤波器的标准差)(3)特征、噪声类型3.判断题√××4.编程题import

cv2

import

numpy

as

np

#

读取图像

img

=

cv2.imread('noisy_image.jpeg')

#

转换为灰度图像(如果需要)

gray

=

cv2.cvtColor(img,

cv2.COLOR_BGR2GRAY)

#

应用均值滤波

blurred_mean

=

cv2.blur(gray,

(5,

5))

#

应用双边滤波

blurred_bilateral

=

cv2.bilateralFilter(gray,

d=9,

sigmaColor=75,

sigmaSpace=75)

#

自定义滤波器核

custom_kernel

=

np.array([[1,

2,

1],

[2,

4,

2],

[1,

2,

1]],

np.float32)

/

16

blurred_custom

=

cv2.filter2D(gray,

-1,

custom_kernel)

#

显示原始图像和滤波后的图像

dWindow('Original

Image',

0)

cv2.imshow('Original

Image',

gray)

dWindow('Mean

Filtered

Image',

0)

cv2.imshow('Mean

Filtered

Image',

blurred_mean)

dWindow('Bilateral

Filtered

Image',

0)

cv2.imshow('Bilateral

Filtered

Image',

blurred_bilateral)

dWindow('Custom

Filtered

Image',

0)

cv2.imshow('Custom

Filtered

Image',

blurred_custom)

#

等待按键,然后关闭窗口

cv2.waitKey(0)

cv2.destroyAllWindows()

模块七直方图与匹配思考题答案如何改进上面第一例程序,使实验结果显示为原始彩色图片,并使用不同颜色的矩形框标注每个模板的匹配结果(如图7-21)?import

cv2

import

numpy

as

np

#

读取输入图像

image

=

cv2.imread('f4.jpg')

#

假设输入图像是彩色图

image_copy

=

image.copy()

#

保留原始图像的副本用于显示

#

读取模板图像列表

templates

=

[cv2.imread('tang.jpg',

0),

cv2.imread('sun.jpg',

0),

cv2.imread('sha.jpg',

0),

cv2.imread('zhu.jpg',

0)]

#

为每个模板分配一个颜色

colors

=

[(0,

255,

0),

(0,

0,

255),

(255,

0,

0),

(255,

0,

255)]

#

绿色、蓝色等

#

存储匹配结果的列表

matches

=

[]

#

对于每个模板执行模板匹配

for

i,

(templ,

color)

in

enumerate(zip(templates,

colors)):

#

获取模板的高度和宽度

w,

h

=

templ.shape[::-1]

templ

=

cv2.cvtColor(templ,

cv2.COLOR_BGR2RGB)

#

执行模板匹配

res

=

cv2.matchTemplate(image,

templ,

cv2.TM_CCOEFF_NORMED)

threshold

=

0.8

#

设置阈值

#

找到匹配位置

loc

=

np.where(res

>=

threshold)

for

pt

in

zip(*loc[::-1]):

cv2.rectangle(image,

pt,

(pt[0]

+

w,

pt[1]

+

h),

color,

2)

#

使用不同颜色绘制矩形

matches.append((pt,

i))

#

存储匹配位置和模板索引

#

显示原始图片

cv2.imshow('Original

Image',

image_copy)

#

显示带有匹配结果的图片

cv2.imshow('Detected',

image)

cv2.waitKey(0)

cv2.destroyAllWindows()

#

输出匹配结果

for

match,

template_idx

in

matches:

print(f"Match

found

at

position

{match}

using

template

{template_idx}")

二、课后习题答案1.单项选择题ABDA2.填空题(1)低(2)逻辑(或布尔)(3)相似度3.判断题×√√4.编程题import

cv2

import

matplotlib.pyplot

as

plt

def

histogram_equalization(image_path):

#

读取图像

image

=

cv2.imread(image_path,

0)

#

0

表示以灰度模式读取图像

#

检查图像是否成功读取

if

image

is

None:

raise

ValueError("图像文件未找到或路径错误。")

#

对图像进行直方图均衡化

equalized_image

=

cv2.equalizeHist(image)

#

显示原始图像和均衡化后的图像

plt.figure(figsize=(10,

5))

#

原始图像

plt.subplot(1,

2,

1)

plt.imshow(image,

cmap='gray')

plt.title('原始图像')

plt.axis('off')

#

均衡化后的图像

plt.subplot(1,

2,

2)

plt.imshow(equalized_image,

cmap='gray')

plt.title('直方图均衡化后的图像')

plt.axis('off')

#

显示图像

plt.show()

#

返回均衡化后的图像

return

equalized_image

#

示例使用

image_path

=

'view.jpg'

#

替换为你的图像路径

histogram_equalization(image_path)模块八绘图和交互一、思考题答案1.如何确定五角星的各顶点坐标?思路:#外点,R外接圆半径x=Rcos(72°*k)y=Rsin(72°*k)k=0,1,2,3,4#内点r=Rsin18°/sin36°x=rcos(72°*k+36°)y=rsin(72°*k+36°)k=0,1,2,3,4实现代码:#任务一

#绘制多边形函数思考题案例实现代码

import

cv2

import

numpy

as

np

#创建白色画布

img

=

np.ones((800,800,3))

#设置图形颜色

color=(0,0,255)

#外接圆半径

R=300

pi_val

=

np.pi

/

180

#r内接圆半径

r

=

R

*

np.sin(18

*

pi_val)

/

np.cos(36

*

pi_val)

pts=[]

#设置五角星的十个顶点

for

i

in

range

(5):

#外点

x=R*np.cos(72*pi_val*i)

y=R*np.sin(72*pi_val*i)

pts.append([x,y])

#内点

x1=r*np.cos(72*pi_val*i+36*pi_val)

y1=r*np.sin(72*pi_val*i+36*pi_val)

pts.append([x1,y1])

#列表转换为数组

pts=np.array([pts],32)

print(pts)

#将坐标整体右移,下移500

pts[:,:]

+=

400

#绘制五角星

cv2.polylines(img,[pts],True,color,5)

cv2.imshow('star',img)

cv2.waitKey()

实现效果:2.如何实现同心圆的绘制,同心圆个数和颜色随机设置?#任务二#鼠标交互操作思考题案例实现代码import

cv2

import

numpy

as

np

import

random

#

定义绘制同心圆函数

def

draw_circle(event,

x,

y,

flags,

param):

#

鼠标左键双击

if

event

==

cv2.EVENT_LBUTTONDOWN:

for

s

in

range(10,150,10):

#

每次点击,都是一种

新颜色

#size=random.randint(10,

100)

r

=

random.randint(0,

255)

g

=

random.randint(0,

255)

b

=

random.randint(0,

255)

cv2.circle(img,

(x,

y),

s,

(b,

g,

r),

2)

img

=

np.zeros((600,

1000,

3),

np.uint8)

dWindow('draw

circles')

#

回调同心圆函数

cv2.setMouseCallback('draw

circles',

draw_circle)

while

True:

#

每次鼠标点击事件都会触发draw_circle,而函数体内会改变img

cv2.imshow('draw

circles',

img)

if

cv2.waitKey(1)

&

0xFF

==

ord('q'):

#

按q键退出

break

cv2.destroyAllWindows()

二、课后习题答案1.单选题ABCD2.判读题√√××√3.编程题(1)以灰度方式读取磁盘上的图像并显示,按下ESC键时,退出图像显示,释放窗口。(2)读取本地视频,按下s键时,将当前视频界面保存成jpg格式的图像,按下q键时退出。模块九图像边缘检测及轮廓检测一、思考题答案以下代码实现了一种基于图像直方图峰值来确定Canny边缘检测阈值的自适应方法。虽然这个方法可能不是最优的,但它提供了一个基础的实现框架,可根据具体的应用场景进行进一步的调整和优化。import

cv2

import

numpy

as

np

def

find_peaks(histogram,

num_peaks=1):

"""

Find

peaks

in

a

histogram.

:param

histogram:

The

histogram

to

search

for

peaks.

:param

num_peaks:

The

number

of

peaks

to

find.

:return:

The

indices

of

the

peaks.

"""

peaks

=

[]

for

i

in

range(1,

len(histogram)

-

1):

if

histogram[i

-

1]

<

histogram[i]

>

histogram[i

+

1]:

peaks.append(i)

return

peaks[:num_peaks]

def

adaptive_canny_edge_detection(image_path):

#

读取图像并转换为灰度图

image

=

cv2.imread(image_path,

cv2.IMREAD_GRAYSCALE)

if

image

is

None:

raise

ValueError("Failed

to

load

image

at

path:

{}".format(image_path))

#

计算图像直方图

hist,

bins

=

np.histogram(image.flatten(),

256,

[0,

256])

#

找到直方图的最大峰值

peaks

=

find_peaks(hist)

max_peak

=

bins[peaks[0]]

if

peaks

else

None

#

如果没有找到峰值,使用默认阈值

if

max_peak

is

None:

low_threshold

=

50

high_threshold

=

150

else:

#

基于峰值设定阈值,这里简单地使用峰值的一定比例

low_threshold

=

int(max(0.3

*

max_peak,

50))

#

确保阈值不会太小

high_threshold

=

int(low_threshold

*

3)

#

高阈值通常是低阈值的倍数

#

进行Canny边缘检测

edges

=

cv2.Canny(image,

low_threshold,

high_threshold)

return

edges,

low_threshold,

high_threshold

#

使用示例

edges,

low_th,

high_th

=

adaptive_canny_edge_detection('path_to_image.jpg')

print(f"Used

thresholds:

Low={low_th},

High={high_th}")

cv2.imshow('Adaptive

Canny

Edges',

edges)

cv2.waitKey(0)

cv2.destroyAllWindows()

二、课后习题答案1.单项选择题CDA2.填空题(1):cv2.Sobel()(2)fftshift(3)cv2.boundingRect()3.判断题√√×4.编程题import

cv2

import

numpy

as

np

#

读取图片

image

=

cv2.imread('clothes.png',

0)

#

0

表示以灰度模式读取

#

应用傅里叶变换

dft

=

cv2.dft(np.float32(image),

flags=cv2.DFT_COMPLEX_OUTPUT)

dft_shift

=

np.fft.fftshift(dft)

#

计算幅度谱

magnitude_spectrum

=

20

*

np.log(cv2.magnitude(dft_shift[:,

:,

0],

dft_shift[:,

:,

1]))

#

应用滤波器(例如高通滤波器)

rows,

cols

=

image.shape

crow,

ccol

=

rows

//

2,

cols

//

2

mask

=

np.zeros((rows,

cols,

2),

np.uint8)

r

=

50

#

滤波器半径

center

=

[crow,

ccol]

x,

y

=

np.ogrid[:rows,

:cols]

mask_area

=

(x

-

center[0])

**

2

+

(y

-

center[1])

**

2

<=

r

*

r

mask[mask_area]

=

1

fshift

=

dft_shift

*

mask

#

逆傅里叶变换

f_ishift

=

np.fft.ifftshift(fshift)

img_back

=

cv2.idft(f_ishift)

img_back

=

cv2.magnitude(img_back[:,

:,

0],

img_back[:,

:,

1])

#

标记能量集中的区域(通过阈值化)

_,

thresh

=

cv2.threshold(magnitude_spectrum,

200,

255,

cv2.THRESH_BINARY)

#

显示结果

cv2.imshow('Original

I

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论