from skimage.transform import rotate
from skimage.feature import local_binary_pattern
from skimage import data, io,data_dir,filters, feature,exposure
from skimage.color import label2rgb
import skimage
import numpy as np
import matplotlib.pyplot as plt
from PIL import ImageEnhance
import cv2
# settings for LBP
radius = 1 # LBP算法中范围半径的取值
n_points = 8 * radius # 领域像素点数
# 读取图像
image = cv2.imread('pic/sunflower500x333.jpg')
#显示到plt中,需要从BGR转化到RGB,若是cv2.imshow(win_name, image),则不需要转化
image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
gam1= exposure.adjust_gamma(image1, 2) #调暗
gam2= exposure.adjust_gamma(image1, 0.5) #调亮
plt.imshow(image1)
plt.title('yuan tu',fontsize='large',fontweight='bold')
plt.show()
plt.imshow(gam1)
plt.title('di liang du he dui bi du',fontsize='large',fontweight='bold')
plt.show()
plt.imshow(gam2)
plt.title('gao liang du he dui bi du',fontsize='large',fontweight='bold')
plt.show()
# 灰度转换
# 转换为灰度图,但plt在显示灰度图的时候,默认以热力图的形式,所以下面还要设置 cmap=‘gray’
image = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
gam1=cv2.cvtColor(gam1,cv2.COLOR_BGR2GRAY)
gam2=cv2.cvtColor(gam2,cv2.COLOR_BGR2GRAY)
plt.imshow(image, cmap='gray')
plt.title('hui du tu',fontsize='large',fontweight='bold')
plt.show()
# LBP处理
lbp = local_binary_pattern(image, n_points, radius)
plt.imshow(lbp, cmap='gray')
plt.title('lbp',fontsize='large',fontweight='bold')
plt.show()
# 边缘提取,sobel算子提取结构信息
edges = filters.sobel(image)
plt.imshow(edges, cmap='gray')
plt.title('yuan tu bian yuan ti qu',fontsize='large',fontweight='bold')
plt.show()
edges_gam1=filters.sobel(gam1)
plt.imshow(edges_gam1, cmap='gray')
plt.title('di liang du bian yuan ti qu',fontsize='large',fontweight='bold')
plt.show()
edges_gam2=filters.sobel(gam2)
plt.imshow(edges_gam2, cmap='gray')
plt.title('gao liang di bian yuan ti qu',fontsize='large',fontweight='bold')
plt.show()
# 这个是没用的,因为最后一个需要显示的图像显示不出来
edges_gam3=filters.sobel(gam2)
plt.imshow(edges_gam2, cmap='gray')
plt.title('gao liang di bian yuan ti qu',fontsize='large',fontweight='bold')
plt.show()
# dst =cv2.normalize(src,dst [,double alpha=1,double beta=0,int norm_type,int dtype,mask])
# 用途:归一化数据。该函数分为范围归一化与数据值归一化
# 参数:
# src 输入数组
# dst 输出数组,数组的大小和原数组一致;
# alpha 1,用来规范值,2.规范范围,并且是下限;
# beta 只用来规范范围并且是上限
#
# norm_type 归一化选择的数学公式类型;
# 1)NORM_MINMAX;(依据是:delta=max-min,也即最小值为0,最大值为1)最常用
# NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化。
# 比如归一化到(min,max)范围内:(X-min(X))*(max-min)/(max(X)-min(X))+min
# 2)NORM_INF;(切比雪夫距离)L∞范数(绝对值的最大值) X/max(abs(X))
# 3)NORM_L1;(曼哈顿距离)L1-范数(绝对值的和) X/sum(abs(X))
# 4)NORM_L2;(依据是:单位向量为1,也即每个数除以 根号下所有数的平方和)
# (欧几里德距离)L2-范数 X/sqrt((sum(X^2)))
#
# dtype 为负输出数组type与输入数组type相同;为正仅通道数相同而tpye=CV_MAT_DEPTH(dtype).
# mark 掩码。选择感兴趣区域,选定后只能对该区域进行操作。
# dst=np.zeros(image.shape,dtype=np.float32)
# cv2.normalize(image,dst=dst,alpha=0.0,beta=1.0,norm_type=cv2.NORM_MINMAX)
# cv2.imshow("NORM_L2",dst)
# print(dst)
# cv2.waitKey(0)
# cv2.destroyAllWindows()