20190911_随笔小实现_对图像进行像素处理

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]

最终结果图像:

猜你喜欢

转载自www.cnblogs.com/codebeef0911/p/11507712.html