(惊艳)基于谷底最小值的阈值的图像分割(改进HSV中的H分量可以用imhist(H)提取)
任务概述:将这张图片作为输入 , 然后抠出只有斑点的图片

灵感来源:
1. 黄色部分用绿色的掩盖掉得到图片B,然后A和B进行∩运算,相同的设置为0
2.统计单词的子母数,开辟一个26个元素的数组,进来一个字母在相应的地方++,类似hashmap
3.为什么要用Hue这个分量下手,因为这幅图就2个颜色,肯定会在2个地方突出来,然后中间的波谷
作为分隔点,其中一个突出来的部分置为0
4.Hue分量在[0,1]连续 变化 , 灰度值和R分量在【0,255】离散的变化,将【0,1】线性变化到【0,255】
R分量就像是随机变量X,自身只能离散的取值 , H分量是double类型的,取值是连续的
I=imread('375.png');
hv=rgb2hsv(I); %自带的函数就是good
H=hv(:,:,1);
S=hv(:,:,2);
V=hv(:,:,3); %也可以分别绘制H,S,V分量的图片
[M,N,D] = size(I);
vec = zeros(1,256) %初始化一个256元素的行矩阵
for i=1:M
for j=1:N
if( round( H(i,j)*255 ) == 0 )
array(1,1) = array(1,1) +0 ;
% if( round( H(i,j)*255 )==257 )
% array(1,256) = array(1,256) +1 ;
else
vec( 1 , round( H(i,j)*255 ) ) = vec( 1 , round( H(i,j)*255 ) ) + 1; %见备注图片 %改进自带的函数
end
end
end
%写入
Mat = array ;
fid = fopen('D:\data.txt','wt');
[row,col] = size(Mat);
for i=1 : row
for j = 1:col
fprintf(fid,'%g\n',Mat(i,j)); %换行
end
end
fclose(fid);

H_hist = imhist(H) 将451*235个值映射到[0,1]区间有多少(将H分量的所有取值映射到[0.255]这256个离散的点上:最精辟理解啊)
那个3段算法中也是将[0,x1]的任一一个点 映射到[0,y1] 这是一对一映射 ,上面那个是多对一映射


假设得到阈值(最后介绍方法) 44
这一步是将大于阈值的点统统处理掉
num = 44/255.0; %手动修改
[M,N] = size(H); for i=1:M
for j=1:N
if( H(i,j) > num ) % 绿色部分显然要多些
V(i,j) = 0;
end; %V分量0是白色
end
end V2 = V;
temp = cat(3,H,S,V2);
temp = hsv2rgb(temp);
imshow(temp);
实现--基于谷底最小值的阈值
1、描述:
此方法实用于具有明显双峰直方图的图像,其寻找双峰的谷底作为阈值,但是该方法不一定能获得阈值,对于那些具有平坦的直方图或单峰图像,该方法不合适。
2、实现过程:
该函数的实现是一个迭代的过程,每次处理前对直方图数据进行判断,看其是否已经是一个双峰的直方图,如果不是,则对直方图数据进行半径为1(窗口大小为3)的平滑,如果迭代了一定的数量比如1000次后仍未获得一个双峰的直方图,则函数执行失败,如成功获得,则最终阈值取两个双峰之间的谷底值作为阈值。
注意在编码过程中,平滑的处理需要当前像素之前的信息,因此需要对平滑前的数据进行一个备份。另外,首数据类型精度限制,不应用整形的直方图数据,必须转换为浮点类型数据来进行处理,否则得不到正确的结果。
知乎上还有人求这个判断双峰的算法
package erer; import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays; public class test { public static int GetMinimumThreshold(int[] HistGram) {
int Y, Iter = 0;
double[] HistGramC = new double[256]; // 基于精度问题,一定要用浮点数来处理,否则得不到正确的结果
double[] HistGramCC = new double[256]; // 求均值的过程会破坏前面的数据,因此需要两份数据
for (Y = 0; Y < 256; Y++) {
HistGramC[Y] = HistGram[Y];
HistGramCC[Y] = HistGram[Y];
} // 通过三点求均值来平滑直方图
while (IsDimodal(HistGramCC) == false) // 判断是否已经是双峰的图像了
{
HistGramCC[0] = (HistGramC[0] + HistGramC[0] + HistGramC[1]) / 3; // 第一点
for (Y = 1; Y < 255; Y++)
HistGramCC[Y] = (HistGramC[Y - 1] + HistGramC[Y] + HistGramC[Y + 1]) / 3; // 中间的点
HistGramCC[255] = (HistGramC[254] + HistGramC[255] + HistGramC[255]) / 3; // 最后一点
// // System.Buffer.BlockCopy(HistGramCC, 0, HistGramC, 0, 256 *
// sizeof(double)); System.arraycopy(HistGramCC, 0, HistGramC, 0, 256); Iter++;
if (Iter >= 1000)
return -1; // 直方图无法平滑为双峰的,返回错误代码
}
// 阈值极为两峰之间的最小值
boolean Peakfound = false;
for (Y = 1; Y < 255; Y++) {
if (HistGramCC[Y - 1] < HistGramCC[Y] && HistGramCC[Y + 1] < HistGramCC[Y])
Peakfound = true;
if (Peakfound == true && HistGramCC[Y - 1] >= HistGramCC[Y] && HistGramCC[Y + 1] >= HistGramCC[Y])
return Y - 1;
}
return -1;
} private static boolean IsDimodal(double[] HistGram) // 检测直方图是否为双峰的
{
// 对直方图的峰进行计数,只有峰数位2才为双峰
int Count = 0;
for (int Y = 1; Y < 255; Y++) {
if (HistGram[Y - 1] < HistGram[Y] && HistGram[Y + 1] < HistGram[Y]) {
Count++;
if (Count > 2)
return false;
}
}
if (Count == 2)
return true;
else
return false;
} public static void main(String args[]) throws IOException { File file = new File("D:\\data.txt");// Text文件
BufferedReader br = new BufferedReader(new FileReader(file));// 构造一个BufferedReader类来读取文件
String s = null;
int[] data1 = new int[256];
int i = 0;
while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行 // System.out.println(s);
System.out.println("--------------");
try {
String str = s;
String str2 = str.replaceAll(" ", "");
System.out.println(str2);
data1[i] = Integer.parseInt(str2);
;
i++;
} catch (NumberFormatException e) {
e.printStackTrace();
}
System.out.println(Arrays.toString(data1));
System.out.println(data1.length); }
br.close();
; int[] HistGram = new int[256]; System.arraycopy(data1, 0, HistGram, 0, 256); int num = GetMinimumThreshold(HistGram); System.out.println("阈值是" + num);
}
}
得到阈值是28,运行

(惊艳)基于谷底最小值的阈值的图像分割(改进HSV中的H分量可以用imhist(H)提取)的更多相关文章
- 理解C# 4 dynamic(4) – 让人惊艳的Clay
Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下,就构建出我们想要的对象.Clay和ExpandoObject相比, ...
- 惊艳!9个不可思议的 HTML5 Canvas 应用试验
HTML5 <canvas> 元素给网页中的视觉展示带来了革命性的变化.Canvas 能够实现各种让人惊叹的视觉效果和高效的动画,在这以前是需要 Flash 支持或者 JavaScript ...
- 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上)【转载】
转自: DBAplus社群 http://www.toutiao.com/m5762164771/ 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上) - 今日头条(TouTiao.com ...
- ( 转 )超级惊艳 10款HTML5动画特效推荐
今天我们要来推荐10款超级惊艳的HTML5动画特效,有一些是基于CSS3和jQuery的,比较实用,特别是前几个HTML5动画,简直酷毙了,现在将它们分享给大家,也许你能用到这些HTML5动画和jQu ...
- 分享10款效果惊艳的HTML5图片特效
在HTML5的世界里,图片特效都十分绚丽,我们在网站上也分享过很多不错的HTML5图片特效,现在我们精选10款效果惊艳的HTML5图片特效分享给大家. 1.HTML5 3D正方体旋转动画 很酷的3D特 ...
- 20 个具有惊艳效果的 jQuery 图像缩放插件
jQuery相对与Flash的魔力已经贯穿整个网络.尽管,Flash层被认为是用于网页设计的首选,然而随着jQuery的出现,以及他的酷似Flash的交互式特效使得网页更加的优雅——Flash开始靠边 ...
- 理解C# 4 dynamic(4) – 让人惊艳的Clay(转)
作者:Justrun名字来自<阿甘正传>,是希望自己能够更更傻一点. link: http://www.cnblogs.com/JustRun1983/p/3529157.html 理 ...
- python实战===2017年30个惊艳的Python开源项目 (转)
本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...
- 超级惊艳 10款HTML5动画特效推荐[转]
ylbtech_html5_demo 今天我们要来推荐 10 款超级惊艳的 HTML5 动画特效,有一些是基于 CSS3 和 jQuery 的,比较实用,特别是前几个 HTML5 动画,简直酷毙了,现 ...
随机推荐
- 离线安装docker镜像
假如由于网络原因,需要在一台无网络的电脑上运行镜像,那么docker是支持的. 你需要做的主要有3步骤: 1:先从一个有网络的电脑下载docker镜像 sudo docker pull ubuntu ...
- java阶段学习目标
0-1年: <java编程思想> 1-2年: <大话设计模式>http://www.cnblogs.com/zuoxiaolong/p/pattern26.html <重 ...
- 数据分析常用的python工具和SQL语句
select symbol, "price.*" from stocks :使用正则表达式来指定列查询 select count(*), avg(salary) from empl ...
- 惊不惊喜, 用深度学习 把设计图 自动生成HTML代码 !
如何用前端页面原型生成对应的代码一直是我们关注的问题,本文作者根据 pix2code 等论文构建了一个强大的前端代码生成模型,并详细解释了如何利用 LSTM 与 CNN 将设计原型编写为 HTML 和 ...
- <context:annotation-config/>和<mvc:annotation-driven/>及解决No mapping found for HTTP request with URI [/role/getRole] in DispatcherServlet with name 'springmvc-config'
1:什么时候使用<context:annotation-config> 当你使用@Autowired,@Required,@Resource,@PostConstruct,@PreDest ...
- ubantu-vim操作
vim其实就是vi的升级版,vi里的所有命令vim里都可以用,一般使用来说几乎没什么差别. 注:本篇文章区分大小写! vi / vim三级模式的关系: 命令行模式 任何时候,不管用户处于何种模式,只要 ...
- 使用Intellij Idea创建简单Maven项目(转)
我是学Java Web的,基本靠自学,在网上收集了各种视频资料,逐一的看,代码逐一的敲.学习了这么久之前一直未成想过要把自己的学习路程记录下来,在网上也看到过很多人把自己的学习历程以及遇到的问题写在了 ...
- Linux并发执行很简单,这么干就对了
嗯,就像标题说的那么简单而已 &的并发功能 time for i in `grep server /etc/hosts | awk '{print $1}'`; do (ssh $i &quo ...
- 17 多校1 Add More Zero 水题
Problem Description There is a youngster known for amateur propositions concerning several mathemati ...
- 【webdriver自动化】使用unittest实现自动登录163邮箱然后新建一个联系人
#练习:登录163邮箱然后新建一个联系人 import unittest import time from selenium import webdriver from selenium.webdri ...