20190911
使用 python 库 cv2 对图像进行了抠图,按位异或,修改像素值 等操作
目标图1:imgS
目标图2:imgG
对两图进行按位异或操作:
代码:
1 imgR = cv2.bitwise_xor(imgS, imgG) 2 cv2.imshow("imgR", imgR)
结果图像:imgR
目标图3:(对此图处理,只保留红点和内圈橙)imgOperate
内圈橙色区域 BGR_橙 = [39, 127, 255]
红点 BGR_红 = [36, 28, 236]
尝试1:遍历每一个像素,将像素值不为 BGR_橙的点像素修改为 [0,0,0],将 BGR_橙改为 [255,255,255]
代码片段:
1 px_3C = [39, 127, 255] # B,G,R 2 3 for hIx in range(0, height, 1): # height 4 for wIx in range(0, width, 1): # width 5 6 # if imgOperate[hIx, wIx] != [39, 127, 255]: # 不能这么操作 7 # imgOperate[hIx, wIx] = [0, 0, 0] 8 # else: 9 # imgOperate[hIx, wIx] = [255, 255, 255] 10 11 for cIx in range(channel): # 对每一个像素点的每一个通道值进行修改 12 if imgOperate[hIx][wIx][cIx] != px_3C[cIx]: 13 imgOperate[hIx][wIx][cIx] = 0 14 else: 15 imgOperate[hIx][wIx][cIx] = 255 16 17 cv2.imshow("imgOperate after Op:", imgOperate)
尝试1结果图像:imgOperate
遗漏分析,没有考虑到外圈黄色区域 BGR_黄 = [0,242,255],在尝试1方法中,第三个 for 遍历 channel Red 时会发生误操作(即保留红色区域红色通道的值)
尝试2:遍历每一个像素点,依据像素值条件修改或保留像素值,即将橙色区域赋值 [255,255,255],红点区域保留原像素值
代码片段:
1 for hIx in range(height): 2 for wIx in range(width): 3 if imgOperate_C[hIx][wIx][0] == 39 and imgOperate_C[hIx][wIx][1] == 127 and imgOperate_C[hIx][wIx][2] == 255: # 橙色区域,改像素 4 imgOperate_C[hIx][wIx][0] = 255 5 imgOperate_C[hIx][wIx][1] = 255 6 imgOperate_C[hIx][wIx][2] = 255 7 elif imgOperate_C[hIx][wIx][0] == 36 and imgOperate_C[hIx][wIx][1] == 28 and imgOperate_C[hIx][wIx][2] == 236: # 红色区域,保留像素 8 imgOperate_C[hIx][wIx][0] = 36 9 imgOperate_C[hIx][wIx][1] = 28 10 imgOperate_C[hIx][wIx][2] = 236
1 else: # 非目标像素 [0, 0, 0] 2 imgOperate_C[hIx][wIx][0] = 0 3 imgOperate_C[hIx][wIx][1] = 0 4 imgOperate_C[hIx][wIx][2] = 0
尝试2结果图像:imgOperate_C
分析:已经把目标区域边界和目标点成功的抠出。
将尝试2结果图像与结果图像进行加运算 cv2.add()
代码:
1 imgR_ROI = cv2.add(imgR, imgOperate_C)
结果图像:imgR_ROI
将结果图像 [255,255,255] 区域还原橙色 [39, 127, 255]
1 for hIx in range(height): 2 for wIx in range(width): 3 if imgR_ROI[hIx][wIx][0] == 255 and imgR_ROI[hIx][wIx][1] == 255 and imgR_ROI[hIx][wIx][2] == 255: 4 imgR_ROI[hIx][wIx][:] = [39, 127, 255]
最终结果图像: