第6章 Python 数字图像处理(DIP) - 彩色图像处理3 -色彩变换、彩色校正、彩色图像平滑和锐化、HSI彩色空间中的分割、RGB空间中的分割、彩色边缘检测
生活随笔
收集整理的這篇文章主要介紹了
第6章 Python 数字图像处理(DIP) - 彩色图像处理3 -色彩变换、彩色校正、彩色图像平滑和锐化、HSI彩色空间中的分割、RGB空间中的分割、彩色边缘检测
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這里寫目錄標題
- 色彩變換
- 彩色圖像平滑和銳化
- 使用彩色分割圖像
- HSI 彩色空間中的分割
- RGB空間中的分割
- 彩色邊緣檢測
- 彩色圖像中的噪聲
色彩變換
# 圖像顏色分量的顯示 from PIL import Imageimg_ori = Image.open('DIP_Figures/DIP3E_Original_Images_CH06/Fig0630(01)(strawberries_fullcolor).tif') img_cmyk = img_ori.convert("CMYK")img_temp = np.array(img_cmyk) img_c = img_temp[:, :, 0] img_m = img_temp[:, :, 1] img_y = img_temp[:, :, 2] img_k = img_temp[:, :, 3]plt.figure(figsize=(20, 25)) plt.subplot(541), plt.imshow(img_cmyk), plt.title('Original CMYK')# CMYK, seems is CMY, as K is all black plt.subplot(545), plt.imshow(img_c, 'gray'), plt.title('Cyan') plt.subplot(546), plt.imshow(img_m, 'gray'), plt.title('Magenta') plt.subplot(547), plt.imshow(img_y, 'gray'), plt.title('Yellow') plt.subplot(5, 4, 8), plt.imshow(img_k, 'gray'), plt.title('Black')# Show RGB channels img_rgb = np.array(img_ori) plt.subplot(5, 4, 9), plt.imshow(img_rgb[:, :, 0], 'gray'), plt.title('Red') plt.subplot(5, 4, 10), plt.imshow(img_rgb[:, :, 1], 'gray'), plt.title('Green') plt.subplot(5, 4, 11), plt.imshow(img_rgb[:, :, 2], 'gray'), plt.title('Blue')# Show HSI channels img_hsi = img_ori.convert("HSV") img_hsi = np.array(img_hsi) plt.subplot(5, 4, 13), plt.imshow(img_hsi[:, :, 0], 'gray'), plt.title('Hue') plt.subplot(5, 4, 14), plt.imshow(img_hsi[:, :, 1], 'gray'), plt.title('Saturation') plt.subplot(5, 4, 15), plt.imshow(img_hsi[:, :, 2], 'gray'), plt.title('Intensity')plt.tight_layout() plt.show() from PIL import Imageimg_ori = Image.open('DIP_Figures/DIP3E_Original_Images_CH06/Fig0630(01)(strawberries_fullcolor).tif') img_cmyk = img_ori.convert("CMYK")img_temp = np.array(img_cmyk) img_c = img_temp[:, :, 0] img_m = img_temp[:, :, 1] img_y = img_temp[:, :, 2] img_k = img_temp[:, :, 3]plt.figure(figsize=(20, 25)) plt.subplot(541), plt.imshow(img_cmyk), plt.title('Original CMYK')# CMYK, seems is CMY, as K is all black plt.subplot(545), plt.imshow(img_c, 'gray'), plt.title('Cyan') plt.subplot(546), plt.imshow(img_m, 'gray'), plt.title('Magenta') plt.subplot(547), plt.imshow(img_y, 'gray'), plt.title('Yellow') plt.subplot(548), plt.imshow(img_k, 'gray'), plt.title('Black')# change K value img_k_new = img_k * 1 + 150 img_cmyk_new = np.dstack((img_c, img_m, img_y, img_k_new))plt.subplot(549), plt.imshow(img_cmyk_new, 'gray'), plt.title('New CMYK')plt.tight_layout() plt.show() def gamma_img(img, c, gamma):img = np.array(img).astype(float)output_img = c * img ** gammaimg_scale = np.uint8((output_img / output_img.max()) * 255)return img_scale def sigmoid_plot(img, scale):x = np.linspace(img.min(), img.max(), 500)x1 = x - 125y = 1 / (1 + np.exp(-x1 / scale))return x, yplt.plot(x, y)plt.grid() def sigmoid_transform(img, scale):img = np.array(img).astype(float)img_temp = (img - 125.)img_new = 1 / (1 + np.exp(-img_temp / scale))img_new = np.uint8(normalize(img_new) * 255)return img_new # 色調(diào)和彩色校正 from PIL import Imageimg_ori = Image.open('DIP_Figures/DIP3E_Original_Images_CH06/Fig0635(top_ left_flower).tif')plt.figure(figsize=(15, 5)) plt.subplot(131), plt.imshow(img_ori), plt.title('Original')img_colour = sigmoid_transform(img_ori, 30)plt.subplot(132), plt.imshow(img_colour), plt.title('Colour Correct')# x, y = sigmoid_plot(np.array(img_ori), 40) # plt.subplot(133), sigmoid_plot(np.array(img_ori), 40), plt.title("Transform")x, y = sigmoid_plot(np.array(img_ori), 40) plt.axes([0.68, 0.15, 0.15, 0.3]), plt.plot(x, y), plt.title("Transform"), plt.grid()# plt.tight_layout() plt.show() # 色調(diào)和彩色校正 from PIL import Imageimg_ori = Image.open('DIP_Figures/DIP3E_Original_Images_CH06/Fig0635(middle_row_left_chalk ).tif')plt.figure(figsize=(10, 5)) plt.subplot(121), plt.imshow(img_ori), plt.title('Original')img_colour = gamma_img(img_ori, 1, 1.5)plt.subplot(1, 2, 2), plt.imshow(img_colour), plt.title('Colour Correct')plt.tight_layout() plt.show() # 色調(diào)和彩色校正 from PIL import Imageimg_ori = Image.open('DIP_Figures/DIP3E_Original_Images_CH06/Fig0635(bottom_left_stream).tif')plt.figure(figsize=(10, 5)) plt.subplot(121), plt.imshow(img_ori), plt.title('Original')img_colour = gamma_img(img_ori, 1, 0.5)plt.subplot(1, 2, 2), plt.imshow(img_colour), plt.title('Colour Correct')plt.tight_layout() plt.show()彩色圖像平滑和銳化
import numpy as npdef arithmentic_mean(image, kernel):""":param image: input image:param kernel: input kernel:return: image after convolution"""img_h = image.shape[0]img_w = image.shape[1]m = kernel.shape[0]n = kernel.shape[1]# paddingpadding_h = int((m -1)/2)padding_w = int((n -1)/2)image_pad = np.pad(image.copy(), (padding_h, padding_w), mode="constant", constant_values=0)image_convol = image.copy()for i in range(padding_h, img_h + padding_h):for j in range(padding_w, img_w + padding_w):temp = np.sum(image_pad[i-padding_h:i+padding_h+1, j-padding_w:j+padding_w+1] * kernel)image_convol[i - padding_h][j - padding_w] = 1/(m * n) * tempimage_convol = np.uint8(normalize(image_convol) * 255)return image_convol # 圖像顏色分量的顯示 from PIL import Image# img_ori = Image.open('DIP_Figures/DIP3E_Original_Images_CH06/Fig0638(a)(lenna_RGB).tif') img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0638(a)(lenna_RGB).tif') img_ori = img_ori[:, :, ::-1]# Show RGB channels plt.figure(figsize=(10, 10)) img_rgb = np.array(img_ori) plt.subplot(2, 2, 1), plt.imshow(img_rgb), plt.title('RGB') plt.subplot(2, 2, 2), plt.imshow(img_rgb[:, :, 0], 'gray'), plt.title('Red') plt.subplot(2, 2, 3), plt.imshow(img_rgb[:, :, 1], 'gray'), plt.title('Green') plt.subplot(2, 2, 4), plt.imshow(img_rgb[:, :, 2], 'gray'), plt.title('Blue')plt.tight_layout() plt.show()# Show HSI channels plt.figure(figsize=(15, 5)) img_hsi = cv2.cvtColor(np.array(img_ori), cv2.COLOR_RGB2HSV) img_hsi = np.array(img_hsi) plt.subplot(1, 3, 1), plt.imshow(img_hsi[:, :, 0], 'gray'), plt.title('Hue') plt.subplot(1, 3, 2), plt.imshow(img_hsi[:, :, 1], 'gray'), plt.title('Saturation') plt.subplot(1, 3, 3), plt.imshow(img_hsi[:, :, 2], 'gray'), plt.title('Intensity')plt.tight_layout() plt.show() # 圖像平滑 mean_kernal = np.ones([5, 5]) mean_kernal = mean_kernal / (mean_kernal.size)img_rgb_new = np.zeros(img_rgb.shape, np.uint8)for i in range(3):img_temp = img_rgb[:, :, i]img_dst = arithmentic_mean(img_temp, kernel=mean_kernal)img_rgb_new[:, :, i] = img_dstimg_hsi_new = np.zeros(img_rgb.shape, np.uint8)for i in range(3):if i == 2:img_temp = img_hsi[:, :, i]img_dst = arithmentic_mean(img_temp, kernel=mean_kernal)img_hsi_new[:, :, i] = img_dstelse:img_hsi_new[:, :, i] = img_hsi[:, :, i]img_hsi_rgb = cv2.cvtColor(img_hsi_new, cv2.COLOR_HSV2RGB)img_diff = img_rgb_new - img_hsi_rgbplt.figure(figsize=(15, 5)) plt.subplot(1, 3, 1), plt.imshow(img_rgb_new), plt.title('RGB') plt.subplot(1, 3, 2), plt.imshow(img_hsi_rgb), plt.title('HSI RGB') plt.subplot(1, 3, 3), plt.imshow(img_diff), plt.title('Differenc')plt.tight_layout() plt.show() def laplacian_img(img_gray):# 拉普拉期算子,用于邊緣檢對于檢測圖像中的模糊也非常有用kernel_laplacian = np.array(([0,1,0],[1,-4,1],[0,1,0]), np.int8)imgkernel_laplacian = cv2.filter2D(img_gray, -1, kernel_laplacian)laplacian_img = np.uint8(normalize(img_gray + imgkernel_laplacian) * 255)return laplacian_img # 圖像銳化 img_rgb_new = np.zeros(img_rgb.shape, np.uint8)for i in range(3):img_temp = img_rgb[:, :, i]img_dst = laplacian_img(img_temp)img_rgb_new[:, :, i] = img_dstimg_hsi_new = np.zeros(img_rgb.shape, np.uint8)for i in range(3):if i == 2:img_temp = img_hsi[:, :, i]img_dst = laplacian_img(img_temp)img_hsi_new[:, :, i] = img_dstelse:img_hsi_new[:, :, i] = img_hsi[:, :, i]img_hsi_rgb = cv2.cvtColor(img_hsi_new, cv2.COLOR_HSV2RGB)img_diff = img_rgb_new - img_hsi_rgbplt.figure(figsize=(15, 5)) plt.subplot(1, 3, 1), plt.imshow(img_rgb_new), plt.title('RGB') plt.subplot(1, 3, 2), plt.imshow(img_hsi_rgb), plt.title('HSI RGB') plt.subplot(1, 3, 3), plt.imshow(img_diff), plt.title('Differenc')plt.tight_layout() plt.show()使用彩色分割圖像
HSI 彩色空間中的分割
# HSI彩色圖像分割img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0642(a)(jupiter_moon_original).tif') img_ori = img_ori[:, :, ::-1] # BGR 2 RGB# Show HSI channels plt.figure(figsize=(14, 20)) img_hsi = cv2.cvtColor(np.array(img_ori), cv2.COLOR_RGB2HSV)plt.subplot(4, 2, 1), plt.imshow(img_ori), plt.title('Ori') plt.subplot(4, 2, 2), plt.imshow(img_hsi[:, :, 0], 'gray'), plt.title('Hue') plt.subplot(4, 2, 3), plt.imshow(img_hsi[:, :, 1], 'gray'), plt.title('Saturation') plt.subplot(4, 2, 4), plt.imshow(img_hsi[:, :, 2], 'gray'), plt.title('Intensity')# Threshold img_s = normalize(img_hsi[:, :, 1]) thresh = 0.255 #0.255 #img_s.max() * 0.1 + 0.233 print(thresh)img_thresh = img_s.copy() img_thresh = np.where(img_thresh <= thresh, img_thresh, 1) img_thresh = np.where(img_thresh > thresh, img_thresh, 0) plt.subplot(4, 2, 5), plt.imshow(img_thresh, 'gray'), plt.title('Binary Thred of Saturation')# Threshold X Hue img_thred_hue = img_hsi[:, :, 0] * img_thresh plt.subplot(4, 2, 6), plt.imshow(img_thred_hue, 'gray'), plt.title('Hue X Binary Thred')# Histogram plt.subplot(4, 2, 7), plt.hist(img_thred_hue.flatten(), bins=256), plt.title('Hue X Binary Thred')# Binary img_binary = img_thred_hue.copy() img_binary = np.where(img_binary <= 125, img_binary, 255) # >125 為1 img_binary = np.where(img_binary > 125, img_binary, 0) # < 125為0 plt.subplot(4, 2, 8), plt.imshow(img_binary, 'gray'), plt.title('Binary')plt.tight_layout() plt.show() 0.255RGB空間中的分割
彩色邊緣檢測
img1_r = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0645(a)(RGB1-red).tif', -1) img1_g = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0645(b)(RGB1-green).tif', -1) img1_b = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0645(c)(RGB1-blue).tif', -1)img1_rgb = np.dstack((img1_r, img1_g, img1_b))img2_r = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0645(e)(RGB2_red).tif', -1) img2_g = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0645(f)(RGB2_green).tif', -1) img2_b = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0645(g)(RGB2_blue).tif', -1)img2_rgb = np.dstack((img2_r, img2_g, img2_b))plt.figure(figsize=(20, 10))plt.subplot(2, 4, 1), plt.imshow(img1_r, 'gray'), plt.title('R channel'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 4, 2), plt.imshow(img1_g, 'gray'), plt.title('G channel'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 4, 3), plt.imshow(img1_b, 'gray'), plt.title('B channel'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 4, 4), plt.imshow(img1_rgb), plt.title('RGB'), plt.xticks([]), plt.yticks([])plt.subplot(2, 4, 5), plt.imshow(img2_r, 'gray'), plt.title('R channel'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 4, 6), plt.imshow(img2_g, 'gray'), plt.title('G channel'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 4, 7), plt.imshow(img2_b, 'gray'), plt.title('B channel'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 4, 8), plt.imshow(img2_rgb), plt.title('RGB'), plt.xticks([]), plt.yticks([])plt.tight_layout() plt.show()彩色圖像中的噪聲
# RGB channel merge to RGB image img1_r = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0648(a)(lenna-noise-R-gauss-mean0-var800).tif', 0) img1_g = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0648(b)(lenna-noise-G-gauss-mean0-var800).tif', 0) img1_b = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0648(c)(lenna-noise-B-gauss-mean0-var800).tif', 0) img1_rgb = np.dstack((img1_r, img1_g, img1_b))plt.figure(figsize=(10, 10))plt.subplot(2, 2, 1), plt.imshow(img1_r, 'gray'), plt.title('R channel'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 2, 2), plt.imshow(img1_g, 'gray'), plt.title('G channel'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 2, 3), plt.imshow(img1_b, 'gray'), plt.title('B channel'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 2, 4), plt.imshow(img1_rgb), plt.title('RGB'), plt.xticks([]), plt.yticks([])plt.tight_layout() plt.show() # convert RGB to HSI, noise affect all channels img1_hsi = cv2.cvtColor(img1_rgb, cv2.COLOR_RGB2HSV_FULL)plt.figure(figsize=(15, 5))plt.subplot(1, 3, 1), plt.imshow(img1_hsi[:, :, 0], 'gray'), plt.title('Hue'), plt.xticks([]), plt.yticks([]) plt.subplot(1, 3, 2), plt.imshow(img1_hsi[:, :, 1], 'gray'), plt.title('Saturation'), plt.xticks([]), plt.yticks([]) plt.subplot(1, 3, 3), plt.imshow(img1_hsi[:, :, 2], 'gray'), plt.title('Intensity'), plt.xticks([]), plt.yticks([])plt.tight_layout() plt.show() # RGB image, only green channel affect noise, but convert to HSI, all channel affect img1_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0650(a)(rgb_image_G_saltpep_pt05).tif') img1_rgb = img1_ori[:, :, ::-1]plt.figure(figsize=(20, 10))img1_hsi = cv2.cvtColor(img1_rgb, cv2.COLOR_RGB2HSV_FULL)plt.subplot(2, 4, 1), plt.imshow(img1_rgb), plt.title('RGB'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 4, 2), plt.imshow(img1_hsi[:, :, 0], 'gray'), plt.title('Hue'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 4, 3), plt.imshow(img1_hsi[:, :, 1], 'gray'), plt.title('Saturation'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 4, 4), plt.imshow(img1_hsi[:, :, 2], 'gray'), plt.title('Intensity'), plt.xticks([]), plt.yticks([])plt.subplot(2, 4, 5), plt.imshow(img1_rgb[:, :, 0], 'gray'), plt.title('R channel'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 4, 6), plt.imshow(img1_rgb[:, :, 1], 'gray'), plt.title('G channel'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 4, 7), plt.imshow(img1_rgb[:, :, 2], 'gray'), plt.title('B channel'), plt.xticks([]), plt.yticks([])plt.tight_layout() plt.show()總結(jié)
以上是生活随笔為你收集整理的第6章 Python 数字图像处理(DIP) - 彩色图像处理3 -色彩变换、彩色校正、彩色图像平滑和锐化、HSI彩色空间中的分割、RGB空间中的分割、彩色边缘检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 规划引擎工作模式
- 下一篇: dedecms更改php目录名称,ded