德胜云资讯,添加一些关于程序相关的内容,仅供大家学习交流(https://www.wxclwl.com)

网站地图

搜索
德胜云咨询
人工智能分类 机器学习 数据分析 图像处理 语言模型
热门标签:
最新标签:

数字图像处理与机器视觉第二版电子书「Python图像处理」 二.OpenCV和Numpy读取修改像素、几何图形绘制数字图像处理第2版课后答案阮秋琦怎么可以错过,

日期:2023/04/23 19:18作者:李育泉人气:

导读:该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子...

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大

少走了弯路,也就错过了风景,无论如何,感谢经历

更多关于Android安全的知识,可前往:

https://blog.csdn.net/ananasorangey/category11955914.html

本篇文章转载自公众号[娜璋AI安全之家]

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

该系列在github所有源代码:

https://github.com/eastmountyxz/ImageProcessing-Python

前一篇文章介绍了Python图像处理基础知识,这篇文章将讲解 OpenCV+Numpy 图像处理基础知识,包括读取像素和修改像素。知识点如下:

一.传统读取像素方法二.传统修改像素方法三.Numpy读取像素方法四.Numpy修改像素方法五.几何图形绘制

学Python近八年,认识了很多大佬和朋友,感恩。由于在外求学且需要养娃,故在CSDN设置成了最低价收费专栏,觉得不错的可以购买抬爱;但作者的本意是帮助更多初学者入门,因此在github开源了所有代码,也在公众号同步更新。深知自己很菜,得拼命努力前行,编程也没有什么捷径,干就对了。希望未来能更透彻学习和撰写文章,同时非常感谢参考文献中的大佬们的文章和分享,共勉。

- https://blog.csdn.net/eastmount

一.传统读取像素方法

1.灰度图像,返回灰度值返回值=图像(位置参数),例:p = img[88,142] print(p)

# -*- coding:utf-8 -*- import cv2 #读取图片 img = cv2.imread("picture.bmp", cv2.IMREAD_UNCHANGED) #灰度图像 p = img[88, 142] print(p) #显示图像 cv2.imshow("Demo", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows() #写入图像 cv2.imwrite("testyxz.jpg", img)

输出结果如下所示:[131 131 131],由于该图是24位BMP,B=G=R输出三个相同结果,有的图像仅有一个像素点则输出一个值。

2.BGR图像,返回值为B、G、R的值例:

b = img[78, 125, 0] print(b)g = img[78, 125, 1] print(g)r = img[78,125, 2] print(r)# -*- coding:utf-8 -*- import cv2 #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #BGR图像 b = img[78, 125, 0] print(b) g = img[78, 125, 1] print(g) r = img[78, 125, 2] print(r) #方法二 bgr = img[78, 125] print(bgr) #显示图像 cv2.imshow("Demo", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows() #写入图像 cv2.imwrite("testyxz.jpg", img)

输出像素和图像如下所示:

15510461[155 104 61]

二.传统修改像素方法

1.修改单个像素值BGR图像可以通过位置参数直接访问像素值并进行修改,输出结果如下所示:

# -*- coding:utf-8 -*- import cv2 #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #BGR图像 print(img[78, 125, 0]) print(img[78, 125, 1]) print(img[78, 125, 2]) #修改像素 img[78, 125, 0] = 255 img[78, 125, 1] = 255 img[78, 125, 2] =255 print(img[78, 125]) img[78, 125] = [10, 10, 10] print(img[78, 125, 0]) print(img[78, 125, 1]) print(img[78, 125, 2]) #方法二 print(img[78, 125]) img[78, 125] = [10, 10, 10] print(img[78, 125])

输出结果如下所示,通过两种方法分别将B、G、R像素值修改为255和0。

15510461255255255[255 255 255][10 10 10]

2.修改区域像素

通过访问图像数组的位置区域实现区域像素修改,比如 [100:150,400:500] 是访问第100到150行,400到500列的区域,再对该区域像素进行修改。代码如下所示:

# -*- coding:utf-8 -*- import cv2 #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #BGR图像 img[100:150, 400:500] = [255, 255, 0] #显示图像 cv2.imshow("Demo", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows() #写入图像 cv2.imwrite("testyxz.jpg", img)

输出结果如下所示,[255, 255, 0]是浅蓝色。

三.Numpy读取像素方法

使用Numpy进行像素读取,调用方式如下:

返回值 = 图像.item(位置参数)# -*- coding:utf-8 -*- import cv2 import numpy #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #Numpy读取像素 blue = img.item(78, 100, 0) green = img.item(78, 100, 1) red = img.item(78, 100, 2) print(blue) print(green) print(red) #显示图像 cv2.imshow("Demo", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()

输出结果如下,注意OpenCV读取图像通道是BGR,也可以转换成RGB在进行处理。

15510461

四.Numpy修改像素方法

使用Numpy的itemset函数修改像素,调用方式如下:

图像.itemset(位置, 新值)

例如:img.itemset((88,99), 255)

# -*- coding:utf-8 -*- import cv2 import numpy #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #Numpy读取像素 print(img.item(78, 100, 0)) print(img.item(78, 100, 1)) print(img.item(78, 100, 2)) img.itemset((78, 100, 0), 100) img.itemset((78, 100, 1), 100) img.itemset((78, 100, 2), 100) print(img.item(78, 100, 0)) print(img.item(78, 100, 1)) print(img.item(78, 100, 2))

输出结果如下:

15510461100100100

也可以同时输出B、G、R三个值,核心代码如下:

print(img[78, 78]) img.itemset((78, 78, 0), 0) img.itemset((78, 78, 1), 0) img.itemset((78, 78, 2), 0) print(img[78, 78]) #[155 104 61] #[0 0 0]

五.几何图形绘制

本小节主要讲解OpenCV中几何图形的绘制方法,包括:

cv2.line()cv2.circle()cv2.rectangle()cv2.ellipse()cv2.polylines()cv2.putText()

1.绘制直线

在OpenCV中,绘制直线需要获取直线的起点和终点坐标,调用cv2.line()函数实现该功能。该函数原型如下所示:

img = line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])– img表示需要绘制的那幅图像– pt1表示线段第一个点的坐标– pt2表示线段第二个点的坐标– color表示线条颜色,需要传入一个RGB元组,如(255,0,0)代表蓝色– thickness表示线条粗细– lineType表示线条的类型– shift表示点坐标中的小数位数

下面的代码是绘制一条直线,通过np.zeros()创建一幅黑色图像,接着调用cv2.line()绘制直线,参数包括起始坐标和颜色、粗细。

# -*- coding:utf-8 -*- import cv2 import numpy as np #创建黑色图像 img = np.zeros((256,256,3), np.uint8) #绘制直线 cv2.line(img, (0,0), (255,255), (55,255,155), 5) #显示图像 cv2.imshow("line", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()

输出结果如图所示,从坐标(0,0)到(255,255)绘制一条直线,其直线颜色为(55,255,155),粗细为5。

基本线条的绘制方法掌握之后,我们能进行简单的变化,比如下面的代码增加了一个简单循环,将图形绘制成了四部分。

# -*- coding:utf-8 -*- import cv2 import numpy as np #创建黑色图像 img = np.zeros((256,256,3), np.uint8) #绘制直线 i = 0 while i<255: cv2.line(img, (0,i), (255,255-i), (55,255,155), 5) i = i + 1 #显示图像 cv2.imshow("line", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()

输出结果如图所示。

2.绘制矩形

在OpenCV中,绘制矩形通过cv2.rectangle()函数实现,该函数原型如下所示:

img = rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])– img表示需要绘制的那幅图像– pt1表示矩形的左上角位置坐标– pt2表示矩形的右下角位置坐标– color表示矩形的颜色– thickness表示边框的粗细– lineType表示线条的类型– shift表示点坐标中的小数位数

下面的代码是绘制一个矩形,通过np.zeros()创建一幅黑色图像,接着调用cv2.rectangle()绘制矩形。

# -*- coding:utf-8 -*- import cv2 import numpy as np #创建黑色图像 img = np.zeros((256,256,3), np.uint8) #绘制矩形 cv2.rectangle(img, (20,20), (150,250), (255,0,0), 2) #显示图像 cv2.imshow("rectangle", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()

输出结果如图,从左上角坐标为(20,20),右下角坐标为(150,250),绘制的矩形颜色为蓝色(255,0,0),粗细为2。

3.绘制圆形

在OpenCV中,绘制矩形通过cv2.rectangle()函数实现,该函数原型如下所示:

img = circle(img, center, radius, color[, thickness[, lineType[, shift]]])– img表示需要绘制圆的图像– center表示圆心坐标– radius表示圆的半径– color表示圆的颜色– thickness如果为正值,表示圆轮廓的厚度;负厚度表示要绘制一个填充圆– lineType表示圆的边界类型– shift表示中心坐标和半径值中的小数位数

下面的代码是绘制一个圆形。

# -*- coding:utf-8 -*- import cv2 import numpy as np #创建黑色图像 img = np.zeros((256,256,3), np.uint8) #绘制圆形 cv2.circle(img, (100,100), 50, (255,255,0), -1) #显示图像 cv2.imshow("circle", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()

输出结果如图所示,它在圆形为(100,100)的位置,绘制了一个半径为50,颜色为(255,255,0)、粗细为4的圆。

注意,如果将粗细设置为“-1”,则绘制的圆为实心,如图所示。

cv2.circle(img, (100,100),50, (255,255,0), -1)

4.绘制椭圆

在OpenCV中,绘制椭圆比较复杂,要多输入几个参数,如中心点的位置坐标,长轴和短轴的长度,椭圆沿逆时针方向旋转的角度等。cv2.ellipse()函数原型如下所示:

img = ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])– img表示需要绘制椭圆的图像– center表示椭圆圆心坐标– axes表示轴的长度(短半径和长半径)– angle表示偏转的角度(逆时针旋转)– startAngle表示圆弧起始角的角度(逆时针旋转)– endAngle表示圆弧终结角的角度(逆时针旋转)– color表示线条的颜色– thickness如果为正值,表示椭圆轮廓的厚度;负值表示要绘制一个填充椭圆– lineType表示圆的边界类型– shift表示中心坐标和轴值中的小数位数

下面是绘制一个椭圆的代码。

# -*- coding:utf-8 -*- import cv2 import numpy as np #创建黑色图像 img = np.zeros((256,256,3), np.uint8) #绘制椭圆 #椭圆中心(120,100) 长轴和短轴为(100,50) #偏转角度为20 #圆弧起始角的角度0 圆弧终结角的角度360 #颜色(255,0,255) 线条粗细2 cv2.ellipse(img, (120, 100), (100, 50), 20, 0, 360, (255, 0, 255), 2) #显示图像 cv2.imshow("ellipse", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()

输出结果如图所示,其椭圆中心为(120,100),长轴为100,短轴为50,偏转角度为20,圆弧起始角的角度为0,圆弧终结角的角度为360,表示一个完整的椭圆。绘制的颜色为(255,0,255),粗细为2。

下面的代码是绘制一个实心椭圆。

# -*- coding:utf-8 -*- import cv2 import numpy as np #创建黑色图像 img = np.zeros((256,256,3), np.uint8) #绘制椭圆 cv2.ellipse(img, (120, 120), (120, 80), 40, 0, 360, (255, 0, 255), -1) #显示图像 cv2.imshow("ellipse", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()

绘制如图所示的图形。

5.绘制多边形

在OpenCV中,调用cv2.polylines()函数绘制多边形,它需要指定每个顶点的坐标,通过这些点构建多边形,其函数原型如下所示:

img = polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])– img表示需要绘制的图像– center表示多边形曲线阵列– isClosed表示绘制的多边形是否闭合,False表示不闭合– color表示线条的颜色– thickness表示线条粗细– lineType表示边界类型– shift表示顶点坐标中的小数位数

下面是绘制一个多边形的代码。

# -*- coding:utf-8 -*- import cv2 import numpy as np #创建黑色图像 img = np.zeros((256,256,3), np.uint8) #绘制多边形 pts = np.array([[10,80], [120,80], [120,200], [30,250]]) cv2.polylines(img, [pts], True, (255, 255, 255), 5) #显示图像 cv2.imshow("ellipse", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()

输出结果如图所示,绘制的多边形为白色的闭合图形。

下面的代码是绘制一个五角星多边形。

# -*- coding:utf-8 -*- import cv2 import numpy as np #创建黑色图像 img = np.zeros((512,512,3), np.uint8) #绘制多边形 pts = np.array([[50, 190], [380, 420], [255, 50], [120, 420], [450, 190]]) cv2.polylines(img, [pts], True, (0, 255, 255), 10) #显示图像 cv2.imshow("ellipse", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()

输出结果如图所示,它将五个顶点左边分别连接起来,构成了一个黄色的五角星。

6.绘制文字

在OpenCV中,调用cv2.putText()函数添加对应的文字,其函数原型如下所示:

img = putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])– img表示要绘制的图像– text表示要绘制的文字– org表示要绘制的位置,图像中文本字符串的左下角– fontFace表示字体类型,具体查看see cv::HersheyFonts– fontScale表示字体的大小,计算为比例因子乘以字体特定的基本大小– color表示字体的颜色– thickness表示字体的粗细– lineType表示边界类型– bottomLeftOrigin如果为真,则图像数据原点位于左下角,否则它在左上角

下面是绘制文字的代码。

# -*- coding:utf-8 -*- import cv2 import numpy as np #创建黑色图像 img = np.zeros((256,256,3), np.uint8) #绘制文字 font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img, I love Python!!!, (10, 100), font, 0.6, (255, 255, 0), 2) #显示图像 cv2.imshow("polylines", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()

输出结果如图所示,绘制的文字为“I love Python!!!”。

四.总结

写到这里,这篇毒基础性文章就介绍结束了。希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。本文首发于CSDN专栏,为了帮助更多同学故在公众号同步更新,一起加油!

一.传统读取像素方法二.传统修改像素方法三.Numpy读取像素方法四.Numpy修改像素方法五.几何图形绘制

学Python近八年,认识了很多大佬和朋友,希望大家一起进步,作者也会继续深入学习并分享Python相关知识。由于在外求学且需要养娃,故在CSDN设置成了最低价收费专栏,觉得不错的可以购买;但作者的本意是帮助更多初学者入门,因此在github开源了所有代码,也在公众号同步更新。深知自己很菜,得拼命努力前行,编程也没有什么捷径,干就对了。希望未来能更透彻撰写相关文章,同时非常感谢参考文献中的大佬们的文章和分享,砥砺前行。

前文回顾(下面的超链接可以点击喔):

[Python图像处理] 一.图像处理基础知识及OpenCV入门函数[Python图像处理] 二.OpenCV+Numpy库读取与修改像素

2020年新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。2021年继续加油!

(By:Eastmount 2021-02-08 夜于贵阳)

参考文献:

[1] 罗子江. Python中的图像处理[M]. 科学出版社,2020.[2] https://blog.csdn.net/eastmount/category_9278090.html[3] 冈萨雷斯. 数字图像处理(第3版)[M]. 电子工业出版社,2013.[4] 阮秋琦. 数字图像处理学(第3版)[M]. 电子工业出版社,2008.[5]毛星云,冷雪飞. OpenCV3编程入门[M]. 电子工业出版社,2015.[6]张铮. 数字图像处理与机器视觉——Visual C++与Matlab实现.[6]网易云课堂_高登教育. Python+OpenCV图像处理

你以为你有很多路可以选择,其实你只有一条路可以走

排行

网站地图

Copyright © 2002-2022 香港德胜云网络 版权所有 | 备案号:蜀ICP备2023007363号-5

声明: 本站内容全部来自互联网,非盈利性网站仅供学习交流