IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 图像增强的递归中值和均值分割一对一灰度映射变换的python实现 -> 正文阅读

[人工智能]图像增强的递归中值和均值分割一对一灰度映射变换的python实现

# -*- coding: utf-8 -*-
# @FileName: (4区)图像增强的递归中值和均值分割一对一灰度映射变换
# @Software: PyCharm
# @Author  :  Xu
# @Time    :2021//09//19

import numpy as np


class RMPOGM:
    '''
    基于均值灰度级得变换
    '''

    def __init__(self, image):
        '''
        读取图像
        '''
        self.image = image
        # print(image)
        for i in range(self.image.get_height()):
            for j in range(self.image.get_width()):
                if self.image.get_v_mat()[i][j] == 127:
                    self.image.get_v_mat()[i][j] = 128
        pass

    def get_InputHistogram(self):
        # 获取图像的V分量
        vMat = self.image.get_v_mat()
        # 计算V通道的直方图
        height = self.image.get_height()
        width = self.image.get_width()
        tt = height * width
        number = 256
        v_density = []
        v_amount = []
        v_gray = []
        for i in range(number):
            t = np.sum(vMat == i)
            d = t / tt
            v_density.append(d)
            v_gray.append(i)
            v_amount.append(t)
        s = []
        for i in range(len(v_amount)):
            if v_amount[i] != 0:
                s.append(i)
        return v_amount, v_density, v_gray, height, width, s

    def get_InputAvg(self, v_den, v_gray):
        '''
        获取图像v通道的均值
        '''
        r_mean = np.sum(np.array(v_den) * np.array(v_gray))
        # print('r_mean',r_mean)
        # self.r_mean = np.mean(self.image.get_v_mat())
        # print(self.r_mean)
        return r_mean
        pass

    def get_H(self, r_mean, v_amount, v_gray):
        '''
        计算r_meanl,r_meanu
        将直方图根据均值划分为H=【HLl,HLu,HUl,HUu】
        '''
        r_mean = int(r_mean)  # 对均值取整,将其转换为灰度级
        r_meanl = 0
        r_meanu = 0
        L = 256
        # 求解均值左边部分的均值
        v1_size = 0
        for i in range(0, r_mean + 1):
            v1_size = v1_size + v_amount[i]
            r_meanl = r_meanl + np.array(v_amount[i]) * np.array(v_gray[i])
        r_meanl = int(r_meanl / v1_size)
        # 求解均值右边部分的均值
        v2_size = 0
        for i in range(r_mean + 1, L):
            v2_size = v2_size + v_amount[i]
            r_meanu = r_meanu + np.array(v_amount[i]) * np.array(v_gray[i])
        r_meanu = int(r_meanu / v2_size)
        return r_meanl, r_mean, r_meanu
        pass

    def get_C(self, v_amount, r_meanl, r_mean, r_meanu):
        '''
        计算非零频率灰度级数
        '''
        # 初始化每个子直方图的大小和比例Alpha
        L = 256
        C_Ll = 0
        C_Lu = 0
        C_Ul = 0
        C_Uu = 0
        Alpha_Ll = 0
        Alpha_Lu = 0
        Alpha_Ul = 0
        Alpha_Uu = 0

        # 第一段
        for i in range(r_meanl + 1):
            if v_amount[i] != 0:
                C_Ll = C_Ll + 1
        Alpha_Ll = np.float((1 + r_meanl) / C_Ll)
        # 第二段
        for i in range(r_meanl + 1, r_mean + 1):
            if v_amount[i] != 0:
                C_Lu = C_Lu + 1
        Alpha_Lu = np.float((r_mean - r_meanl) / C_Lu)
        # 第三段
        for i in range(r_mean + 1, r_meanu + 1):
            if v_amount[i] != 0:
                C_Ul = C_Ul + 1
        Alpha_Ul = np.float((r_meanu - r_mean) / C_Ul)
        # 第四段
        for i in range(r_meanu + 1, L):
            if v_amount[i] != 0:
                C_Uu = C_Uu + 1
        Alpha_Uu = np.float((L - 1 - r_meanu) / C_Uu)
        # print('C总和', C_Ll + C_Lu + C_Ul + C_Uu)
        # print('Alpha总和', Alpha_Ll+Alpha_Lu+Alpha_Ul+Alpha_Uu)
        return Alpha_Ll, Alpha_Lu, Alpha_Ul, Alpha_Uu, C_Ll, C_Lu, C_Ul, C_Uu
        pass

    def get_MapGray(self, r_meanl, r_mean, r_meanu,alpha1, alpha2, alpha3, alpha4, C_Ll, C_Lu, C_Ul, C_Uu):
        '''
        计算最后经过映射后输出的灰度级s
        '''
        s_Ll = np.zeros(C_Ll)
        s_Lu = np.zeros(C_Lu)
        s_Ul = np.zeros(C_Ul)
        s_Uu = np.zeros(C_Uu)
        #第一段直方图Ll
        for j in range(C_Ll):
            s_Ll[j]= int ((j+1) * alpha1)
        s_Ll=s_Ll.astype(np.uint8)
        #第二段直方图Lu
        for j in range(C_Lu):
            s_Lu[j] =int(r_meanl+(j + 1) * alpha2)
        s_Lu = s_Lu.astype(np.uint8)
        #第三段直方图Ul
        for j in range(C_Ul):
            s_Ul[j] = int(r_mean+(j + 1) * alpha3)
        s_Ul = s_Ul.astype(np.uint8)
        #第四段直方图Uu
        for j in range(C_Uu):
            s_Uu[j] = int(r_meanu+(j + 1) * alpha4)
        s_Uu = s_Uu.astype(np.uint8)
        s = list(s_Ll)+list(s_Lu)+list(s_Ul)+list(s_Uu)
        return s
        pass
```python
from OneToOneMap import RMPOGM
from util import Image
import numpy as np
import cv2 as cv


def init_RMPOGM(image):
    Map = RMPOGM(image)
    # 计算亮度通道的频数,频率,灰度级
    v_amount, v_density, v_gray, height, width, s_old = Map.get_InputHistogram()
    # 计算整幅图像亮度通道的均值
    r_avg = Map.get_InputAvg(v_density, v_gray)
    # 根据均值,划分为左右直方图
    r_meanl, r_mean, r_meanu = Map.get_H(r_avg, v_amount, v_gray)
    # 对四个分段直方图统计其权重和频数
    alpha1, alpha2, alpha3, alpha4, C_Ll, C_Lu, C_Ul, C_Uu = Map.get_C(v_amount, r_meanl, r_mean, r_meanu)
    # 计算最后经过映射后输出的灰度级s
    s = Map.get_MapGray(r_meanl, r_mean, r_meanu,alpha1, alpha2, alpha3, alpha4, C_Ll, C_Lu, C_Ul, C_Uu)
    s = np.array(s)
    s_old = np.array(s_old)
    temp = image.get_v_mat()
    # temp = cv.resize(image.get_v_mat(), (256,256))
    cv.imshow("orignal_img", temp)
    for i in range(image.get_height()):
        for j in range(image.get_width()):
            if image.get_v_mat()[i][j] in s_old:
                image.get_v_mat()[i][j] = s[np.argwhere(s_old == image.get_v_mat()[i][j])[0][0]]
    print(image.get_v_mat())
    temp = image.get_v_mat()
    hsv_result_img = cv.merge([image.get_h_mat(),image.get_s_mat(),temp])
    bgr_result_img=cv.cvtColor(hsv_result_img,cv.COLOR_HSV2BGR)
    # cv.imshow("v_img", cv.resize(temp, (256,256)))
    cv.imshow("v_img",temp)
    # finally_img = cv.resize(bgr_result_img, (256,256))
    finally_img = bgr_result_img
    cv.imshow("finally_img", finally_img)
    cv.waitKey()
    cv.destroyAllWindows()
    pass


def run(path, pathName):
    image = Image(path)
    # 得到一维输出V分量图像
    init_RMPOGM(image)


if __name__ == '__main__':

    t = "picturedataset/datasetLcenter/"
    for i in range(1):
        name = str(17 + 1)
        path = t + name + ".jpg"
        run(path, name)



  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:02:58  更:2022-04-01 00:03:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:44:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码