假设f(x,y),g(x,y)分别为两幅已知的图像,图像的线性操作就是直接在每个位置的像素上做运算(两幅图像的尺寸需保持一致),最终得到的图像s(x,y),可能会出现以下问题:
1)会出现不在 [ 0-255 ] 之间的像素点存在,最简单的操作就是小于0的像素点置为0,大于255的像素点置为255,或者可以做最大最小值均衡,将图像的对比度拉回来
2)可能会出现float,double等,一般来说最后图像像素的类型都是无符号整数unit8
加 s(x,y) = f(x,y) + g(x,y)
减 s(x,y) = f(x,y) - g(x,y)
乘 s(x,y) = f(x,y) x g(x,y)
除 s(x,y) = f(x,y) / g(x,y)
通过对注射放射线液体前后的脑部拍摄CT图,再通过图像减法,获取血液流动情况:
#图像减法 - 血液流动
ori1 = cv2.imread('min1.tif')
ori1 = cv2.cvtColor(ori1,cv2.COLOR_RGB2GRAY)
ori2 = cv2.imread('min2.tif')
ori2 = cv2.cvtColor(ori2,cv2.COLOR_RGB2GRAY)
cv2.imshow('minus1',ori1)
cv2.imshow('minus2',ori2)
cv2.waitKey()
city3 = ori2 - ori1
city3[city3 <= 55] = 255
cv2.imshow('city',city3)
cv2.waitKey()
第一幅为注射前,第二幅为注射后,通过减法得到:
# 图像相乘
ori1 = cv2.imread('mul1.tif')
ori1 = cv2.cvtColor(ori1,cv2.COLOR_RGB2GRAY)
ori2 = cv2.imread('mul2.tif')
ori2 = cv2.cvtColor(ori2,cv2.COLOR_RGB2GRAY)
mul3 = np.zeros_like(ori1)
for i in range(np.shape(ori1)[0]):
for j in range(np.shape(ori1)[1]):
t = float(ori1[i][j])/float(ori2[i][j])
if t * ori1[i][j]> 255:
mul3[i][j] = 255
else:
mul3[i][j] = t * ori1[i][j]
plt.figure()
plt.subplot(1,3,1)
plt.imshow(ori1,'gray')
plt.subplot(1,3,2)
plt.imshow(ori2,'gray')
plt.subplot(1,3,3)
plt.imshow(mul3,'gray')
plt.show()
图像的逻辑操作与矩阵类似,只不过这里是像素点,所以有几个不同的地方
图像 A={(x,y,z} 与 B={(x,y,z)} 的交集一般视情况而定,有时会涉及到逻辑操作
图像 A={(x,y,z} 与 B={(x,y,z)} 的并集定义为:
图像 A={(x,y,z} 的补集定义为:
K=2**k - 1 k为灰度级
#图像补集 并集
body1 = cv2.imread('body.tif')
body1 = cv2.cvtColor(body1,cv2.COLOR_RGB2GRAY)
body2 = copy.deepcopy(body1)
body3 = copy.deepcopy(body1)
body2[body1<32] = 32 #并
body3 = 255 - body1#补
plt.figure()
plt.subplot(1,3,1)
plt.imshow(body1,'gray')
plt.subplot(1,3,2)
plt.imshow(body2,'gray')
plt.subplot(1,3,3)
plt.imshow(body3,'gray')
plt.show()
参考:<<数字图像处理>>第三版