目录
1.强分层法
2.灰度级彩色变换
3.频率域彩色变换
1.强分层法
按层划分灰度级数(像素幅值),每层灰度与单一颜色进行映射
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*intervalreturn img_color
2.灰度级彩色变换
灰度级和RGB颜色按一定关系映射
def color_enhence(img):"""伪彩色增强(根据图像灰度值进行伪彩色划分):param img: 输入灰度图像:return img_color:伪彩色增强图像(ndim=2)"""w,h = img.shapeimg_color = np.zeros((w,h,3)) # 0:R // 1:G //2::Bfor 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]=0img_color[row][col][1]=I_gray*4img_color[row][col][2]=255elif I_gray>=64 and I_gray<128: # (64-128)img_color[row][col][0] = 0img_color[row][col][1] = 255img_color[row][col][2] = (128-I_gray)*4-1elif I_gray>=128 and I_gray<192: # (64-192)img_color[row][col][0] = (I_gray-128)*4img_color[row][col][1] = 255img_color[row][col][2] = 0else: # (192-255)img_color[row][col][0] = 255img_color[row][col][1] = (192-I_gray)*4-1img_color[row][col][2] = 0return img_color
3.频率域彩色变换
通过滤波器划分三个频域,通过直方图均衡化后,映射到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//2mid_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] = 1else:filter[row][col] = 0return filterelif 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] = 0else:filter[row][col] = 1return filterelif 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] = 1else:filter[row][col] = 0return 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.shapeimg_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_shiftimg_dft_band = filter_band_pass * img_dft_shiftimg_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_lowimg_color[:,:,1] = img_bandimg_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
4.处理结果
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()