import cv2 #引用opencv功能包
#创建窗口,用于显示图片
cv2.namedWindow('MyWindow', cv2.WINDOW_NORMAL) # 使用该函数,使后面用同样名字的imshow显示的图片窗口可以改变大小
#提示停止方法
print ('Press key "Q" to stop.')
frame = cv2.imread('RGB.jpg',1) #以彩色图像格式读取图片
Quit = 1 #是否继续运行标志位
while Quit:
keycode = cv2.waitKey(3) # 每3ms刷新一次图片,同时读取3ms内键盘的输入
if keycode&0xFF == ord('q'): #如果按下“Q”键,停止运行标志位置1,调出while循环,程序停止运行
Quit = 0
cv2.imshow('MyWindow', frame) # 显示原图
# RGB转灰度图像
frame_gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #注意是BGRopencv读取图片的默认像素排列是BGR
cv2.imshow('frame_gray', frame_gray) # 直接imshow(),系统会自动执行nameWindow()创建窗口
cv2.imwrite('gray.jpg', frame_gray) # 保存灰度图像为文件
# 灰度图像二值化处理获得黑白图像
frame_binary = cv2.inRange(frame_gray,100,150) #图像中低于 100 的值,其所对应的图像值将为 0;图像中高于 150 的值,图像值变为 0 。
# 换言之,源图像中仅有图像值介于 100 和 150 之间的值才不为 0 ,且值将变成 255
cv2.imshow('frame_binary', frame_binary) # 显示二值化图像
cv2.imwrite('frame_binary.jpg', frame_binary) # 显示二值化图像
#RGB通道分离
b,g,r = cv2.split(frame)
# 显示三通道图像
cv2.imshow('r', r) # 二值化后的通道R
cv2.imshow('g', g) # 二值化后的通道G
cv2.imshow('b', b) # 二值化后的通道B
# 分别保存三通道图片
cv2.imwrite('r.jpg', r)
cv2.imwrite('g.jpg', g)
cv2.imwrite('b.jpg', b)
# BGR转HSV颜色空间
frame_HSV = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
cv2.imshow('frame_HSV', frame_HSV) # 显示图片
cv2.imwrite('frame_HSV.jpg', frame_HSV) # 保存图片
# frame = cv2.imread('RGB.jpg', 1) # 循环读取图片
print ('Quitted!') #提示程序已停止
cv2.destroyAllWindows() #程序停止前关闭所有窗口
import cv2
import numpy as np
def callback(object):
pass
#创建窗口
cv2.namedWindow('win1')
#提示停止方法
print ('Showing camera. Press key "Q" to stop.')
cameraCapture = cv2.VideoCapture(0) #创建读取摄像头的类
success,frame = cameraCapture.read() #读取第一帧图片,返回值为(是否成功读取, 图片)
#创建画布、窗口、进度条
canvas = np.zeros((170,600,3),dtype=np.uint8)+255 #创建画布放置阈值动态调节窗口
cv2.imshow("THRESHOLD",canvas)
cv2.createTrackbar("R_min","THRESHOLD",0,255,callback)#输入参数(参数名字,进度条附着窗口名字,进度条最小值,进度条最大值,回调函数)
cv2.createTrackbar("G_min","THRESHOLD",0,255,callback)
cv2.createTrackbar("B_min","THRESHOLD",0,255,callback)
cv2.createTrackbar("R_max","THRESHOLD",0,255,callback)
cv2.createTrackbar("G_max","THRESHOLD",0,255,callback)
cv2.createTrackbar("B_max","THRESHOLD",0,255,callback)
Quit = 1 #是否继续运行标志位
while success and Quit :
keycode = cv2.waitKey(1)
if keycode&0xFF == ord('q'): #如果按下“Q”键,停止运行标志位置1,调出while循环,程序停止运行
Quit = 0
# 相关变量绑定进度条
R_min = cv2.getTrackbarPos("R_min", "THRESHOLD") #获得进度条值
G_min = cv2.getTrackbarPos("G_min", "THRESHOLD", )
B_min = cv2.getTrackbarPos("B_min", "THRESHOLD", )
R_max = cv2.getTrackbarPos("R_max", "THRESHOLD", )
G_max = cv2.getTrackbarPos("G_max", "THRESHOLD", )
B_max = cv2.getTrackbarPos("B_max", "THRESHOLD", )
# 分别对RGB三通道进行二值化
b, g, r = cv2.split(frame) #RGB通道分离
cv2.imshow('r', r) # 通道R
cv2.imshow('g', g) # 通道G
cv2.imshow('b', b) # 通道B
frame_threshold_B = cv2.inRange(b, B_min, B_max)# 通道R二值化
frame_threshold_G = cv2.inRange(g, G_min, G_max) # 通道G二值化
frame_threshold_R = cv2.inRange(r, R_min, R_max) # 通道B二值化
cv2.imshow('frame_threshold_R', frame_threshold_R) # 窗口显示二值化后的通道R
cv2.imshow('frame_threshold_G', frame_threshold_G) # 窗口显示二值化后的通道G
cv2.imshow('frame_threshold_B', frame_threshold_B) # 窗口显示二值化后的通道B
# 3通道二值化结果相与
Binary_RGB_AND = cv2.bitwise_and(frame_threshold_R,frame_threshold_G) #相与
frame_binary_manual = cv2.bitwise_and(frame_threshold_B,Binary_RGB_AND) # 最终结果
cv2.imshow('frame_binary_manual', frame_binary_manual) # 窗口显示彩色图像手动二值化结果
# 直接对RGB图像进行二值化
lower_rgb = np.array([B_min, G_min, R_min]) #注意这里是BGR,
upper_rgb = np.array([B_max, G_max, R_max]) #因为opencv读取图片的默认像素排列是BGR
frame_binary = cv2.inRange(frame,lower_rgb,upper_rgb)# 使用数组进行图像二值化
cv2.imshow('win1', frame) # 窗口显示原图
cv2.imshow('frame_binary', frame_binary) # 窗口显示对RGB图像进行二值化的结果
success,frame = cameraCapture.read() #读取第一帧图片,返回值为(是否成功读取, 图片)
if success == 0: #提示由于摄像头读取失败停止程序
print ('Camera disconnect !')
print ('Quitted!') #提示程序已停止
cv2.destroyAllWindows() #程序停止前关闭所有窗口
cameraCapture.release #程序停止前关闭摄像头调用
在图像处理中 膨胀腐蚀 是最基本也是最常用的操作,它常用来 清除图像中的杂质,在 目标识别 时也常来 构建连通域 以便进行抠图。
二值图像 可以当做一个 值只有 0 和 1 的矩阵,1 代表白色,0 代表黑色。
膨胀 就是 每个元素与周围一定范围内的元素进行或操作,与原值相比变化了则保持变化,结果就是 白色部分膨胀(黑色部分变小)了一定范围。
下例中,先膨胀,清除白色矩形内的杂质,由于进行了膨胀,图像发生了变形(白色部分变大),我们再进行腐蚀,使图像返回原来的形状。这时我们发现白色矩形内的黑斑没有出现。然后我们再进行一次腐蚀然后进行膨胀,把左上角的白色杂质也清除掉。
腐蚀核 可以使用 cv2.getStructingElement 函数描述,具体可以参考 这里(可以自己定义大小,核的大小决定每个像素的影响范围)
腐蚀 可用函数 cv2.erode 函数,其参数内容可以参考这里
膨胀 可用函数 cv2.dilate 函数
kernel_width=7 #膨胀腐蚀的范围大小
kernel_height=7 #膨胀腐蚀的范围大小
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(kernel_width,kernel_height)) #创建膨胀腐蚀核
frame_threshold_D = cv2.dilate(frame_binary,kernel) #膨胀
frame_binary_DE = cv2.erode(frame_binary_DE, kernel) #腐蚀
frame_binary_DE = cv2.erode(frame_binary_DE, kernel) #腐蚀
frame_binary_DE = cv2.dilate(frame_binary_DE, kernel) #膨胀