图像处理入门二
1.OpenCV绘制各类几何图形
介绍如何使用OpenCV 绘制各类几何图形,包括 cv2.line()、v2.circle()、cv2.rectangle()、cv2.ellipse()、cv2.polylines()、cv2.putText()函数
(1)绘制直线:绘制直线需要获取直线的起点和终点坐标,坐标原型:img = line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
- color 表示线条颜色,需要传入一个 RGB 元组,如(255,0,0)代表蓝色
- thickness 表示线条粗细
- lineType 表示线条的类型
- shift 表示点坐标中的小数位数
# 下面的代码是绘制一条直线,通过 np.zeros()创建一幅黑色图像,接着调用 cv2.line()绘制直线,参数包括起始坐标和颜色、粗细
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.destoryAllWindows()
(2)绘制矩形:cv2.rectangle()
~~ 绘制圆形:cv2.circle()(圆心-半径-线条颜色-线条粗细)
cv2.circle(img, (100,100), 50, (255,255,0), 4) (空心圆)
将粗细设置为‘-1’为实心圆
cv2.circle(img, (100,100), 50, (255,255,0), -1)
~~ 绘制椭圆:cv2.ellipse()(圆心-轴长度短、长半径-偏转角度逆时针-圆弧起始角的角度-终结角的角度逆时针旋转-颜色-粗细
cv2.ellipse(img, (120, 100), (100, 50), 20, 0, 360, (255, 0, 255), 2)
~~ 绘制多边形:cv2.polylines()
多边形曲线阵列pts(左上,右上,右下,左下)(按点顺序连接)
polylines(多边形是否闭合true闭合,颜色,粗细)
pts = np.array([[10,80], [120,80], [120,200], [30,250]])
cv2.polylines(img, [pts], True, (255, 255, 255), 5)
五角星
pts = np.array([[50, 190], [380, 420], [255, 50], [120, 420],[450,190]])
cv2.polylines(img, [pts], True, (0, 255, 255), 10)
~~ 绘制文字:cv.putText()
font(字体类型)
putText(文字-绘制的位置左下角-字体类型-字体大小-颜色-粗细) (字体的大小,计算为比例因子乘以字体特定的基本
大小)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, ‘I love Python!I love Huawei!’,
(10, 100), font, 0.5, (255, 255, 0), 2)
#矩形-创建-绘制-显示
img=np.zeros((256,256,3),np.uint8)
cv2.rectangle(img,(20,20),(150,250),(255,0,0),2)
#(20,20)左上坐标,(150,250)右上坐标
cv2.imshow('rectangle',img)
2.图像算数与逻辑运算详解
本节将详细讲解图像算法运算与逻辑运算,包括图像加法、图像减法、图像与运算、图像或运算、图像非运算与图像异或运算
(1)图像加法\减法运算:Numpy和OpenCV都可以实现
cv2.add() 图像变亮
cv2.subtract() 图像变暗
import cv2
import numpy as np
#读取图片
img=cv2.imread('luo.png')
#图像各像素加100
m1=np.ones(img.shape,dtype='uint')*100
#图像个像素减50
m2=np.ones(img.sahpe,dtype='uint')*50
#OpenCV加法运算
result1=cv2.add(img,m1)
#OpenCV减法操作
result2=cv2.subtract(img,m2)
#显示图像
cv2.imshow('original',img)
cv2.imshow('result1',result1)
cv2.imshow('result2',result2)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()
(2)图像与/或运算
与/或:是指两张图像(灰度图像或彩色图像均可)的每个像素值进行二进制“与”/“或”操作,实现图像裁剪
异或:如果 a、b 两个值不相同,则异或结果为 1;如果a、b 两个值相同,异或结果为 0
cv2.bitwise_and()
cv2.birwise_or()
cv2.bitxwise_xor()
#读取图片
img=cv.imread('luo.png',cv2.IMREAD_GRAYSCALE)
#获取图像的宽和高
rows,cols=img.shape[:2]
#化圆形
circle=np.zeros((rows,cols),dtype='uint8')
cv2.circl(circle,(int(rows/2,int(cols/2)),100,255,-1)
print(circle.shape)
print(img.size,circle.size)
#OpenCV图像与运算
result1=cv2.bitwise_and(img,circle)
#OpenCV图像或运算
result2=cv2.bitwise_or(img,circle)
#OpenCV图像异或运算
result3=cv2.bitwise_xor(img,circle)
#显示图像
cv2.imshow('orignal',img)
cv2.imshow('circle',circle)
cv2.imshow('result1',result1)
cv2.imshow('result2',result2)
cv2.imshow('result3',result3)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()
(3) 图像的非运算:图像非运算就是图像的像素反色处理,它将原始图像的黑色像素点转换为白色像素点,白色像素点则转换为黑色像素点
cv2.bitwise_not()
#读取图片
img = cv2.imread("Lena.png", cv2.IMREAD_GRAYSCALE)
#OpenCV 图像非运算
result = cv2.bitwise_not(img)
#显示图像
cv2.imshow("original", img)
cv2.imshow("result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()