深度学习中RGB影像图的直方图均衡化python代码and对图片中指定部分做基于掩模的特定区域直方图均衡化

news2024/12/28 19:09:11

深度学习很重要的预处理步骤
就是需要对做直方图均衡化
其中主要分成灰度图以及RGB图的直方图均衡化
这俩的方法和代码不同
想要去看具体原理的朋友可以查看下面这篇博客的内容
写的很详细
颜色直方图均衡化(https://www.cnblogs.com/wancy/p/17668345.html)

我们这个场景中会用到的就是颜色直方图均衡化了
其中包含三种方法


方法1.在BGR颜色空间下进行直方图均衡化,可以分别对每个通道进行均衡化。

以下是批量读取某个文件夹中的所有图片,并对每张图片做RGB直方图均衡化,使用OpenCV库实现彩色图像直方图均衡化(在BGR颜色空间)的代码:

import cv2
import os
import shutil

filePath = r"F:\deepl\sample\complete\road3\white"  # 用于获取文件名称列表
new_path = r"F:\deepl\sample\complete\road3\white-rgb"  # 目标文件夹
#move_path = r"F:\deepl\sample\complete\water2\sat"  # 目标文件夹

file_names = filter(lambda x: x.find('png')!=-1, os.listdir(filePath))

# print(file_list)

for file in file_names:
# 读取彩色图像
    path=filePath+'\\'+file
    img = cv2.imread(path)
    # 分离BGR图像的通道
    b, g, r = cv2.split(img)
    # 对每个通道进行直方图均衡化
    equ_b = cv2.equalizeHist(b)
    equ_g = cv2.equalizeHist(g)
    equ_r = cv2.equalizeHist(r)
    equ_img = cv2.merge((equ_b, equ_g, equ_r))#合并均衡化后的通道
    # 显示均衡化前后的彩色图像
    path2=new_path+'\\'+file
    cv2.imwrite(path2, equ_img)
#cv2.imshow('Original Image', img)
#cv2.imshow('Equalized Image', equ_img)
#cv2.waitKey(0)
#cv2.destroyAllWindows()

做均衡化前后的图片如下所示:

但是,由于我的图片中有些图片存在大面积白色,因此均衡之后颜色就变成了这样:

很明显,由于白色区域的影响,这个结果明显是不对的,想了各种办法:

1、比如用PS把白色区域删掉,保存成png透明背景的再跑上面的代码,结果不对

2、用PS把上面的白色区域先变成灰色,再跑,结果也还是不对

总结原因:是因为我们上面的代码是做全局直方图均衡化,并不是局部的,因此即使是透明背景,结果做出来也不对

而且为了只让我选定的区域做直方图均衡化,其他区域不变

就需要用到下面的方法

基于掩模的特定区域直方图均衡化

这里也是参考了这位博主的文章

但这里他是对灰度图像做的,我们要做的是RGB影像

因此我对代码进行了修改,可以对RGB进行基于掩模的特定区域颜色直方图均衡化

话不多说

直接看代码

import cv2
import os
import numpy as np

filePath = r"F:\deepl\sample\complete\road3\white"  # 用于获取文件名称列表
new_path = r"F:\deepl\sample\complete\road3\white-rgb"  # 目标文件夹
mask_path = r"F:\deepl\sample\complete\road3\white-mask"  # 目标文件夹
#move_path = r"F:\deepl\sample\complete\water2\sat"  # 目标文件夹

file_names = filter(lambda x: x.find('png')!=-1, os.listdir(filePath))

# print(file_list)

for file in file_names:
# 读取彩色图像
    path=filePath+'\\'+file
    mask_path=mask_path+'\\'+file
    img = cv2.imread(path)
    # 分离BGR图像的通道
    b, g, r = cv2.split(img)
    
    mask = cv2.imread(mask_path, 0)
    coord = np.where(mask == 255)
    print(coord)
    b_mask = b[coord]
    g_mask = g[coord]
    r_mask = r[coord]
    # 对每个通道进行直方图均衡化
    equ_b = cv2.equalizeHist(b_mask)
    equ_g = cv2.equalizeHist(g_mask)
    equ_r = cv2.equalizeHist(r_mask)
    equ_img = cv2.merge((equ_b, equ_g, equ_r))#合并均衡化后的通道
    img2 = img.copy()
    for i, C in enumerate(zip(coord[0], coord[1])):
        img2[C[0], C[1]] = equ_img[i][0]
    
    # 显示均衡化前后的彩色图像
    path2=new_path+'\\'+file
    cv2.imwrite(path2, img2)
#cv2.imshow('Original Image', img)
#cv2.imshow('Equalized Image', equ_img)
#cv2.waitKey(0)
#cv2.destroyAllWindows()

上面3张图分别是RGB原图,黑白掩模,均衡化后的结果

这下可以看出,我们只对其中一部分指定区域做了均衡化

成功!

但是如何批量化跑呢?

我想要让程序自动从文件夹中读取图片,自动将白色和非白色区域生成掩模,然后自动读取后制作均衡化后的结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1408805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++ - 编程语法特性

目录 标准控制台框架 输入输出对象 命名空间 标准控制台框架 头文件 ​#include <iostream>​​ 告诉编译器我们要使用iostream库尖括号中的名字指定了某个头文件(header) 入口函数 ​int main(void)​​ 返回 ​return 0;​​ 输出语句 ​std::cout << "H…

生产力工具|卸载并重装Anaconda3

一、Anaconda3卸载 &#xff08;一&#xff09;官方方案一&#xff08;Uninstall-Anaconda3-不能删除配置文件&#xff09; 官方推荐的方案是两种&#xff0c;一种是直接在Anaconda的安装路径下&#xff0c;双击&#xff1a; &#xff08;可以在搜索栏或者使用everything里面搜…

一站式VR全景婚礼的优势表现在哪里?

你是否想过&#xff0c;婚礼也可以用一种全新的方式呈现&#xff0c;VR全景婚礼让每位用户沉浸式体验婚礼现场感。现在很多年轻人&#xff0c;都想让自己的婚礼与众不同&#xff0c;而VR全景婚礼也是未来发展的方向之一。 很多婚庆公司开通了VR婚礼这一服务&#xff0c;就是通过…

BACnet转MQTT网关BA113

随着通讯技术和控制技术的发展&#xff0c;为了实现楼宇的高效、智能化管理&#xff0c;集中监控管理已成为楼宇智能管理发展的必然趋势。在此背景下&#xff0c;高性能的楼宇暖通数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于楼宇自控和暖通空调系统应用中…

如何利用streamlit 將 gemini pro vision 進行圖片內容介紹

如何利用streamlit 將 gemini pro vision 進行圖片內容介紹 1.安裝pip install google-generativeai 2.至 gemini pro 取 api key 3.撰寫如下文章:(方法一) import json import requests import base64 import streamlit as st 讀取圖片檔案&#xff0c;並轉換成 Base64 編…

76.Go分布式ID总览

文章目录 简介一&#xff1a;UUID二、雪花算法三&#xff1a;Leaf-snowflake四&#xff1a;数据库自增ID五&#xff1a;使用Redis实现分布式ID生成六&#xff1a;使用数据库分段&#xff08;Leaf-segment&#xff09;七 &#xff1a;增强版Leaf-segment八&#xff1a;Tinyid九&…

浅学JAVAFX布局

JAVAFX FlowPane布局 Flowpane是一个容器。它在一行上排列连续的子组件&#xff0c;并且如果当前行填充满了以后&#xff0c;则自动将子组件向下推到一行 public class FlowPanedemo extends Application {Overridepublic void start(Stage stage) throws Exception {stage.s…

C++入门篇章1(C++是如何解决C语言不能解决的问题的)

目录 1.C关键字(以C98为例)2.命名空间2.1 命名空间定义2.2命名空间使用 3.C输入&输出4.缺省参数4.1缺省参数概念4.2 缺省参数分类 5. 函数重载5.1函数重载概念5.2 C支持函数重载的原理--名字修饰(name Mangling) 1.C关键字(以C98为例) C总计63个关键字&#xff0c;C语言32…

go api(get post传参,数据库,redis) 测试

介绍&#xff1a;分别测试get请求&#xff0c;post请求&#xff0c;请求链接数据库&#xff0c;以及redis操作。 1.api代码 package mainimport (_ "database/sql""encoding/json""github.com/gin-gonic/gin""go-test/com.zs/database&quo…

【RT-DETR有效改进】交叉形窗口网络 | CSWinTransformer(附代码 + 修改教程)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

【GitHub项目推荐--一款美观的开源社区系统】【转载】

推荐一款开源社区系统&#xff0c;该系统基于主流的 Java Web 技术栈&#xff0c;如果你是一名 Java 新手掌握了基本 JavaEE 框架知识&#xff0c;可以拿本项目作为练手项目。 开源社区系统功能还算完善包含发布帖子、发布评论、私信、系统通知、点赞、关注、搜索、用户设置、…

ToDesk/向日葵的MAC远程鼠标控制不了?如何解决

不知道各位使用Mac电脑的小伙伴们&#xff0c;在日常进行跨设备远控操作时是否曾遇到过远程鼠标控制不了的问题&#xff1f;其实这是因为有项系统权限没有开设导致的&#xff0c;本篇文章木木小编就给大家逐步教学一下针对该问题如何解决才有效&#xff01; 当通过ToDesk远程连…

vue中图片不显示问题 - vue中静态资源加载

文章目录 vue中图片不显示问题静态资源URL 转换规则webpack 静态资源处理 图片不显示问题问题描述解决办法1&#xff1a;使用require引入require is not defined 解决办法2&#xff1a;使用import引入解决办法3&#xff1a;将图片放进公共文件夹static或public vue中图片不显示…

当世界加速离你而去

当世界加速离你而去 会不会这个标题显的太悲观&#xff0c;也可能是耳机里正在放着To Be Frank的原因。 对于阳历跨年我是没有太多的感觉&#xff0c;而且跨年夜忙着约会&#xff0c;所以2023年的跨年文章今天才出来。 一年的时间一晃就过了。2022年12月9日时候彻底结束了风控…

基于EfficientNet(B0-B7)全系列不同参数量级模型开发构建中草药图像识别分析系统,实验量化对比不同模型性能

EfficientNet系列的模型在我们前面开发识别类项目或者是检测类项目都是比较少去使用的&#xff0c;一方面是技术本身迭代发展的速度是比较快的&#xff0c;可能新的东西还没学习更新的东西就出来了&#xff0c;另一方面是EfficientNet本身实际业务使用度并不高&#xff0c;可能…

maptalks 右键删除多边形 电子围栏

<!-- 地图组件 --> <template><div :id"id" class"container"></div> </template><script> import _ from "lodash"; import "maptalks/dist/maptalks.css"; import * as maptalks from "ma…

RDMA vs InfiniBand 网卡接口如何区分?

(该架构图来源于参考文献) 高性能计算网络&#xff0c;RoCE vs. InfiniBand该怎么选&#xff1f; 新 RoCEv2 标准可实现 RDMA 路由在第三层以太网网络中的传输。RoCEv2 规范将用以太网链路层上的 IP 报头和 UDP 报头替代 InfiniBand 网络层。这样&#xff0c;就可以在基于 IP…

虹科分享丨AR与AI融合加速,医疗护理更便捷!

来源&#xff1a;虹科数字化与AR 虹科分享丨AR与AI融合加速&#xff0c;医疗护理更便捷&#xff01; 原文链接&#xff1a;https://mp.weixin.qq.com/s/Fi0wNfk_TDXRo_1-6cSRNQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #AR眼镜 #医疗护理 根据Reports and Da…

【动态规划】【map】【C++算法】1289. 下降路径最小和 II

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 map LeetCode1289. 下降路径最小和 II 给你一个 n x n 整数矩阵 grid &#xff0c;请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路径 定义为&#xff1a;从 grid 数组中的每一行选择一个数字&#xff0c;…

云计算项目五:部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务

部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务 案例1:配置逻辑卷步骤一:创建LV步骤二:格式化案例2:配置数据库服务器步骤一:安装软件MySQL服务软件(2台数据库服务器都要安装)步骤二:挂载lv设备步骤三:启动服务步骤四:管理员登录案例3:配置主从同步步骤一…