├── README.md └── Saliency_LC_Algor.py /README.md: -------------------------------------------------------------------------------- 1 | # Saliency_LC_Algorithm 2 | 图像显著性检测算法 - LC 3 | -------------------------------------------------------------------------------- /Saliency_LC_Algor.py: -------------------------------------------------------------------------------- 1 | # Author: jwj 2 | # Time: 2018/5/7 3 | # Name: Saliency_LC_Algor.py 4 | # Desc: 图像显著性基础算法 LC算法 图像中每个像素与其他所有像素的灰度值距离之和作为该像素的显著值(采用直方图计算) 5 | 6 | 7 | import os 8 | import cv2 9 | import time 10 | import glob 11 | from threading import Thread 12 | import numpy as np 13 | 14 | 15 | def read_image(image_path): 16 | image = cv2.imread(image_path) 17 | min_edge = min(image.shape[0], image.shape[1]) # 图片窄边 18 | proportion = 1 # 缩放比例 19 | if min_edge > 3000: 20 | proportion = 0.1 21 | elif 2000 < min_edge <= 3000: 22 | proportion = 0.2 23 | elif 1000 < min_edge <= 2000: 24 | proportion = 0.3 25 | elif 700 <= min_edge <= 1000: 26 | proportion = 0.4 27 | resize_image = cv2.resize(image, None, fx=proportion, fy=proportion, interpolation=cv2.INTER_CUBIC) 28 | image_gray = cv2.cvtColor(resize_image, cv2.COLOR_BGR2GRAY) 29 | return image_gray 30 | 31 | 32 | def LC(image_gray): 33 | image_height = image_gray.shape[0] 34 | image_width = image_gray.shape[1] 35 | image_gray_copy = np.zeros((image_height, image_width)) 36 | hist_array = cv2.calcHist([image_gray], [0], None, [256], [0.0, 256.0]) # 直方图,统计图像中每个灰度值的数量 37 | gray_dist = cal_dist(hist_array) # 灰度值与其他值的距离 38 | # print(gray_dist) 39 | for i in range(image_width): 40 | for j in range(image_height): 41 | temp = image_gray[j][i] 42 | image_gray_copy[j][i] = gray_dist[temp] 43 | image_gray_copy = (image_gray_copy - np.min(image_gray_copy)) / (np.max(image_gray_copy) - np.min(image_gray_copy)) 44 | return image_gray_copy 45 | 46 | 47 | def cal_dist(hist): 48 | dist = {} 49 | for gray in range(256): 50 | value = 0.0 51 | for k in range(256): 52 | value += hist[k][0] * abs(gray - k) 53 | dist[gray] = value 54 | return dist 55 | 56 | 57 | def get_img_name(src): 58 | return src.split('\\')[-1][:-4] 59 | 60 | 61 | def save_saliency_image(saliency_image, img_name): 62 | save_dir = "Saliency_LC\\" 63 | if not os.path.exists(save_dir): 64 | os.mkdir(save_dir) 65 | cv2.imwrite(save_dir + "saliency_%s.jpg" % img_name, saliency_image*255) 66 | 67 | 68 | def plot(image): 69 | cv2.imshow("gray saliency image", image) 70 | cv2.waitKey(0) 71 | 72 | 73 | def main(file_path): 74 | start = time.time() 75 | image_gray = read_image(file_path) 76 | image_name = get_img_name(file_path) 77 | saliency_image = LC(image_gray) 78 | end = time.time() 79 | print("Duration: %.2f seconds." % (end - start)) 80 | 81 | plot(saliency_image) 82 | save_saliency_image(saliency_image, image_name) 83 | 84 | 85 | if __name__ == "__main__": 86 | # file = "SkinImages\\*.jpg" 87 | # images_list = glob.glob(file) 88 | # for img in images_list: 89 | # thread = Thread(target=main, args={img, }) 90 | # thread.start() 91 | 92 | file = "SkinImages\\bird.jpg" 93 | main(file) 94 | --------------------------------------------------------------------------------