任务概述:将这张图片作为输入 , 然后抠出只有斑点的图片

灵感来源:

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)提取)的更多相关文章

  1. 理解C# 4 dynamic(4) – 让人惊艳的Clay

    Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下,就构建出我们想要的对象.Clay和ExpandoObject相比, ...

  2. 惊艳!9个不可思议的 HTML5 Canvas 应用试验

    HTML5 <canvas> 元素给网页中的视觉展示带来了革命性的变化.Canvas 能够实现各种让人惊叹的视觉效果和高效的动画,在这以前是需要 Flash 支持或者 JavaScript ...

  3. 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上)【转载】

    转自: DBAplus社群 http://www.toutiao.com/m5762164771/ 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上) - 今日头条(TouTiao.com ...

  4. ( 转 )超级惊艳 10款HTML5动画特效推荐

    今天我们要来推荐10款超级惊艳的HTML5动画特效,有一些是基于CSS3和jQuery的,比较实用,特别是前几个HTML5动画,简直酷毙了,现在将它们分享给大家,也许你能用到这些HTML5动画和jQu ...

  5. 分享10款效果惊艳的HTML5图片特效

    在HTML5的世界里,图片特效都十分绚丽,我们在网站上也分享过很多不错的HTML5图片特效,现在我们精选10款效果惊艳的HTML5图片特效分享给大家. 1.HTML5 3D正方体旋转动画 很酷的3D特 ...

  6. 20 个具有惊艳效果的 jQuery 图像缩放插件

    jQuery相对与Flash的魔力已经贯穿整个网络.尽管,Flash层被认为是用于网页设计的首选,然而随着jQuery的出现,以及他的酷似Flash的交互式特效使得网页更加的优雅——Flash开始靠边 ...

  7. 理解C# 4 dynamic(4) – 让人惊艳的Clay(转)

    作者:Justrun名字来自<阿甘正传>,是希望自己能够更更傻一点. link: http://www.cnblogs.com/JustRun1983/p/3529157.html   理 ...

  8. python实战===2017年30个惊艳的Python开源项目 (转)

    本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...

  9. 超级惊艳 10款HTML5动画特效推荐[转]

    ylbtech_html5_demo 今天我们要来推荐 10 款超级惊艳的 HTML5 动画特效,有一些是基于 CSS3 和 jQuery 的,比较实用,特别是前几个 HTML5 动画,简直酷毙了,现 ...

随机推荐

  1. mac以及centos下安装Elasticsearch 以及权限管理插件

    Elasticsearch安装(提前系统需要安装java环境)mac安装 brew install elasticsearch centos安装 下载ElasticSearch安装包,https:// ...

  2. Java集合排序方法comparable和comparator的总结

    一.概述Comparable和Comparator都是用来实现集合中元素的比较.排序的.Comparable是在集合内部定义的方法实现的排序,位于java.lang下.Comparator是在集合外部 ...

  3. c/c++动态内存分配的区别

    c中动态内存分配使用malloc和free. malloc指定需要分配的内存大小,分配成功则返回指向该内存的指针,不成功则返回空指针.返回的指针类型为void *,表示不确定指针所指内存存放的数据类型 ...

  4. Flask源码阅读-第一篇(flask包下的__main__.py)

    源码: # -*- coding: utf-8 -*-""" flask.__main__ ~~~~~~~~~~~~~~ Alias for flask.run for ...

  5. python分析nginx自定义日志

    # -*- coding:utf-8 -*- import datetimeimport re logfile = '''192.168.23.43 - 2017-12-14:00:14:41 /se ...

  6. $_SERVER['URI']

    WordPress通过301重定向实现非首先域(非www)跳转向本来是一个很简单事情,由于没弄清楚$_SERVER['HTTP_X_REWRITE_URL'] 和$_SERVER['REQUEST_U ...

  7. python DRF操作流程

    # 其实就是Django RESTful Framework # RESTful一种API的命名风格,主要因为前后端分离开发出现 # 前后端分离: 用户访问静态文件的服务器,数据全部由ajax请求给到 ...

  8. Arrays.copyOfRange()

    Comparable[] aux = Arrays.copyOfRange(arr,from, to); 复制数组arr, from下标开始, to下标结束. 但是不包括to. 所以复制代码为 Com ...

  9. box-sizing布局

    box-sizing 语法:box-sizing: content-box | border-box | inherit; 参考: https://www.jianshu.com/p/e2eb0d8c ...

  10. HDU1548- A strange lift (BFS入门)

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1548 A Strrange lift Time Limit: 2000/1000 MS (Java/ ...