目录
1.强分层法
2.灰度级彩色变换
3.频率域彩色变换
按层划分灰度级数(像素幅值),每层灰度与单一颜色进行映射
def strong_layering(img,layer):
"""
强分层法
:param img: 输入灰度图像
:param layer: 灰度级数分层数
:return:伪彩色增强图像(ndim=2)
"""
w,h = img.shape[:2]
img_color = np.zeros((w,h),dtype=np.uint8)
for row in range(w):
for col in range(h):
interval = 256//layer #分层的灰度级数间隔
I_layer = img[row][col]//interval#像素所在层数(0-layer)
img_color[row][col] = I_layer*interval
return img_color
灰度级和RGB颜色按一定关系映射
def color_enhence(img):
"""
伪彩色增强(根据图像灰度值进行伪彩色划分)
:param img: 输入灰度图像
:return img_color:伪彩色增强图像(ndim=2)
"""
w,h = img.shape
img_color = np.zeros((w,h,3)) # 0:R // 1:G //2::B
for row in range(w):
for col in range(h):
I_gray = img[row][col]
if I_gray>=0 and I_gray<64: # (0-64)
img_color[row][col][0]=0
img_color[row][col][1]=I_gray*4
img_color[row][col][2]=255
elif I_gray>=64 and I_gray<128: # (64-128)
img_color[row][col][0] = 0
img_color[row][col][1] = 255
img_color[row][col][2] = (128-I_gray)*4-1
elif I_gray>=128 and I_gray<192: # (64-192)
img_color[row][col][0] = (I_gray-128)*4
img_color[row][col][1] = 255
img_color[row][col][2] = 0
else: # (192-255)
img_color[row][col][0] = 255
img_color[row][col][1] = (192-I_gray)*4-1
img_color[row][col][2] = 0
return img_color
通过滤波器划分三个频域,通过直方图均衡化后,映射到RGB颜色区域
#理想滤波器
def filter(img,mode,radius,radius2=None):
"""
理想滤波器(mask生成器)
:param img: 输入图像(频率域)
:param mode: low_pass:低通 / high_pass:高通 / band_pass 带通
:param radius: 带通内径/高低通半径
:param radius2: 带通外径
:return: filter/mask
"""
w,h = img.shape[:2]
mid_row = w//2
mid_col = h//2 #中心点
filter = np.ones((w,h),dtype=np.uint8)
if mode=='low_pass':
for row in range(w):
for col in range(h):
distance = (np.sqrt((mid_row-row)**2+(mid_col-col)**2))
if distance<=radius:
filter[row][col] = 1
else:
filter[row][col] = 0
return filter
elif mode=='high_pass':
for row in range(w):
for col in range(h):
distance = (np.sqrt((mid_row-row)**2+(mid_col-col)**2))
if distance<=radius:
filter[row][col] = 0
else:
filter[row][col] = 1
return filter
elif mode == 'band_pass':
for row in range(w):
for col in range(h):
distance = (np.sqrt((mid_row-row)**2+(mid_col-col)**2))
if distance>=radius and distance<=radius2:
filter[row][col] = 1
else:
filter[row][col] = 0
return filter ##
def frequency_transform(img,radius,radius2):
"""
频率域变换颜色
:param img: 输入灰度图像
:param radius: 滤波器内径(带通滤波器high)
:param radius2: 滤波器外径(带通滤波器low)
:return: 伪彩色增强图像(ndim=3)
"""
img = np.float32(img)
w,h = img.shape
img_dft = cv.dft(img,flags=cv.DFT_COMPLEX_OUTPUT)
img_dft_shift = np.fft.fftshift(img_dft)
"""生成滤波器"""
filter_low_pass = filter(img,"low_pass",radius=radius)
filter_band_pass = filter(img,"band_pass",radius=radius,radius2=radius2)
filter_high_pass = filter(img,"high_pass",radius=radius2)
"""增加滤波器的维度(复制二维升三维)"""
filter_low_pass = np.expand_dims(filter_low_pass,2).repeat(2,2)
filter_band_pass = np.expand_dims(filter_band_pass, 2).repeat(2, 2)
filter_high_pass = np.expand_dims(filter_high_pass, 2).repeat(2, 2)
"""滤波为三个频率分量"""
img_dft_low = filter_low_pass * img_dft_shift
img_dft_band = filter_band_pass * img_dft_shift
img_dft_high = filter_high_pass * img_dft_shift
"""ishift"""
img_dft_low_ishift = np.fft.ifftshift(img_dft_low)
img_dft_band_ishift = np.fft.ifftshift(img_dft_band)
img_dft_high_ishift = np.fft.ifftshift(img_dft_high)
"""idft"""
img_idft_low = cv.idft(img_dft_low_ishift)
img_idft_band = cv.idft(img_dft_band_ishift)
img_idft_high = cv.idft(img_dft_high_ishift)
"""各个频率映射到RGB颜色"""
img_low = cv.magnitude(img_idft_low[:,:,0],img_idft_low[:,:,1])
img_band = cv.magnitude(img_idft_band[:,:,0],img_idft_band[:,:,1])
img_high = cv.magnitude(img_idft_high[:,:,0],img_idft_high[:,:,1])
img_color = np.zeros((w,h,3),dtype=np.float32)
img_color[:,:,0]= img_low
img_color[:,:,1] = img_band
img_color[:,:,2] = img_high
"""灰度直方图均衡化"""
img_color = cv.convertScaleAbs(img_color)
img_color_R = cv.equalizeHist(img_color[:,:,0]) #三通道分别直方图均衡化
img_color_G = cv.equalizeHist(img_color[:,:,1])
img_color_B = cv.equalizeHist(img_color[:,:,2])
img_color_equal = cv.merge((img_color_R,img_color_G,img_color_B))
return img_color_equal
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
img = cv.imread("images/Brain.jpg")
img_gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
plt.figure("彩色增强")
plt.subplot(131);plt.title("灰度级转换RGB")
plt.imshow(color_enhence(img_gary));plt.axis('off');
plt.subplot(132);plt.title("强分层法")
plt.imshow(strong_layering(img_gary,8));plt.axis('off');
plt.subplot(133);plt.title("频率转RGB")
plt.imshow(frequency_transform(img_gary,10,20));plt.axis('off');
plt.show()