1. 程式人生 > >基於鄰域投票的噪聲邊緣抑制

基於鄰域投票的噪聲邊緣抑制

前段時間做Contour Grouping比較糾結的一個問題是受噪聲邊緣的干擾太厲害。

這裡說的噪聲邊緣指的是非目標的邊緣,比如我現在在做交通影象,那麼,出了車的輪廓,其他對於我來說都是噪聲影象。在實際做的時候,遇到的主要是車內部的噪聲。

於是,設計了一個通過投票來累積一個我叫做噪聲度(noise probability)的值,然後設定一個閾值去過濾,初步效果還不錯。

主要思想是:

  1. 觀察周圍一個閾值範圍內是否有邊緣。對於邊界來說,只有一側有,或者兩側都沒有
  2. 投票函式不能是距離的正比函式,因為越遠離邊緣,對其影響應該越弱,於是拿Gaussian函式拿來簡單改造一下使用;

效果圖片:

實現程式碼:
% To build into contourInhibition.m
% 
% This script is used for implementing contour noise inhibition
% 
% Created by visionfans @ 2011.07.02

%% clear workpace
close all;clear ;clc

%% define display variables
nrows = 2;
ncols = 3;
iPlotNum = 1;
bDisp = 1;

%% 1 % load image
imgFolder = '../test/car';
imgFileName = '1.jpg';

imInput = imread(fullfile(imgFolder,imgFileName));
[nHeight nWidth nChannel] = size(imInput);

iSizeRatio = 256 / nWidth;
imInput = imresize(imInput,[nHeight*iSizeRatio 256]);

if bDisp
	hFig = figure;
end

if ndims(imInput)==3
	imInput = rgb2gray(imInput);
	
	subplot(nrows,ncols,iPlotNum);
	imshow(imInput);title('input image');
	iPlotNum = iPlotNum + 1;
end

if bDisp
	subplot(nrows,ncols,iPlotNum);
	imshow(imInput);title('grayscale image');
	iPlotNum = iPlotNum + 1;
end

%% 2 % edge detection
% imEdge = im2bw(imInput);
imEdge = edge(imInput,'canny'); % ,[],'horizontal');

if bDisp
	figure(hFig);
	subplot(nrows,ncols,iPlotNum);
	imshow(imEdge);title('edge map');
	iPlotNum = iPlotNum + 1;
end

%% 3 % line segments fitting
filtLength = 40;
% find curves with length more than filtLength
[edgelist edgelabelim] = edgelink(imEdge, filtLength);
% fit curves using straight lines with derivative no more than 2 pixels
lines = lineseg(edgelist, 2);

% show curves with color
imRGB = label2rgb(edgelabelim,'lines','k');

if bDisp
	figure(hFig);
	subplot(nrows,ncols,iPlotNum);
	imshow(imRGB);title('curve segments');
	iPlotNum = iPlotNum + 1;
	
	subplot(nrows,ncols,iPlotNum);
	showedgelist(lines,size(imEdge),1);
	title('fitted line segments');
	iPlotNum = iPlotNum + 1;
end

%% 4 % filter out vertical edges
lineDir = atan(abs((lines(:,1)-lines(:,3))./(lines(:,2)-lines(:,4)))) .* 180 ./ pi;
lineLen = sqrt((lines(:,1)-lines(:,3)).^2 + (lines(:,2)-lines(:,4)).^2);

% filter out lines with direction larger than 45 and length larger than 10
indVertLines = find((lineDir > 45) & (lineLen > 10));
numLines = length(indVertLines);
vertLines = lines(indVertLines,:);

vLineFig = figure;
showedgelist(vertLines,size(imEdge),1);
title('vertical line segments');

%% 5 % plot middle points of every line segment
midPoints = round([(vertLines(:,1)+vertLines(:,3))/2 (vertLines(:,2)+vertLines(:,4))/2]);

figure(vLineFig);
hold on;
plot(midPoints(:,1),midPoints(:,2),'yo');	% draw middle points
for i=1:numLines
	% show line index number at 4 pixels above mid point
	text(midPoints(i,1),midPoints(i,2)-4,num2str(i),'Color','r');
end
% 	plot(lines(:,1),lines(:,2),'ro');			% draw right points
% 	plot(lines(:,3),lines(:,4),'bo');			% draw left points
hold off;

%% 6 % calculate normalized distance matrix
% calculate the absolute distance
distMat = zeros(numLines);
for i=1:numLines
	for j=1:numLines
		% if horizonal distance exceeds the length sum of the 2 segments
		if abs(midPoints(j,1)-midPoints(i,1)) < (lineLen(indVertLines(i))+lineLen(indVertLines(j)))/2-6
			% contribution distance 
			distMat(i,j) = midPoints(j,2) - midPoints(i,2);
		else
			% no contribution
			distMat(i,j) = 0;
		end
	end
end

avergDist = mean(sum(abs(distMat(:))))./sum(distMat(:)~=0);

% threshold the distance matrix
distThresh = avergDist * 0.5 ;
distMat(abs(distMat)>distThresh) = 0;	

% normalize the distance matrix using the image diagonal
distMat = distMat ./ avergDist;

%% 7 % accumulate the surrounding information

% calculate the number difference between the two sides of the contour
sideDiff = abs(sum(distMat>0,2) - sum(distMat<0,2));

% assume the line segment is infinite far from itself
distMat(distMat==0) = Inf;				

%% 8 % calculate the voting values

sourdMat = zeros(numLines);
for i=1:numLines
	sourdMat(i,:) = exp(-abs(sqrt(exp(sideDiff(i)))*distMat(i,:)));
end

% the probability of each to be a noise contour
resSaliencyMat = sum(sourdMat,2);
resSaliencyMat(sum(distMat>0 & distMat ~= Inf,2)==0) = 0;
resSaliencyMat(sum(distMat<0 & distMat ~= -Inf,2)==0) = 0;

% show noise probability of every segment
vCostFig = figure;
showedgelist(vertLines,size(imEdge),1);
hold on;
plot(midPoints(:,1),midPoints(:,2),'yo');
 for i=1:numLines
	% show line index number at 4 pixels above mid point
	text(midPoints(i,1),midPoints(i,2)-4,num2str(resSaliencyMat(i)),'Color','r');
 end
hold off;


%% 9 % thresholding the line segments to filter the noise ones
noiseThresh = 1;
% remove noise line from original image
lines(indVertLines(resSaliencyMat > noiseThresh),:) = [];
if bDisp
	figure(hFig);
	subplot(nrows,ncols,iPlotNum);
	showedgelist(lines,size(imEdge),1);
	title('line segments after filtering');
	iPlotNum = iPlotNum + 1;
end


這張影象只演示了水平方向上的邊緣抑制效果。

計算結果:

相應的,各個邊緣的noise probality(非嚴謹意義上的概率)度量為:

對這些噪聲程度值設定一個閾值進行過濾,就得到第一張圖片最後那張效果圖了。

相關推薦

基於投票噪聲邊緣抑制

前段時間做Contour Grouping比較糾結的一個問題是受噪聲邊緣的干擾太厲害。 這裡說的噪聲邊緣指的是非目標的邊緣,比如我現在在做交通影象,那麼,出了車的輪廓,其他對於我來說都是噪聲影象。在實際做的時候,遇到的主要是車內部的噪聲。 於是,設計了一個通過投票來累積一個

基於的推薦算法

width contain sed span odi def -m 用戶組 復雜 基於鄰域的算法,就是最常見的CF協同過濾算法。分為 基於用戶的 user based CF 和 基於物品的 item based CF. 1.user based CF 對目標用戶u, 找出與

Neo4j 做推薦 (12)—— 協同過濾(基於的推薦)

kNN——K近鄰 現在我們有了一種基於偏好查詢類似使用者的方法,下一步是允許每個k個最相似的使用者投票選擇應該推薦的專案。 主要有:             

從零開始學推薦系統一:基於的演算法

本系列文章會從最簡單的推薦系統到目前主流的推薦系統解決方案做總結。 1. 基於鄰域的演算法 基於鄰域的演算法是推薦系統中最基本的演算法,在業界得到了廣泛應用。基於鄰域的演算法分為兩大類,一類是基於使用者的協同過濾演算法,另一類是基於物品的協同過濾演算法。 1.1 基於使用者的協同過濾演算法(UserCF

基於的協同過濾演算法(一)

  兩個月前我開始學習機器學習,這兩個月期間學習了一些基礎的機器學習演算法及其Python實現。這周我剛開始學習《推薦系統實踐》這本書,並打算以後定期將自己的學習情況做個簡單的總結。這份總結是我這個部落格上的第一篇文章。這周的學習的主要內容是基於鄰域的協同過濾演

推薦系統-基於的演算法

最近在看項亮的《推薦系統實踐》,文章只有只有程式碼片段,沒有完整的程式碼。所以在原有程式碼之上,根據書籍介紹的內容,還原了部分程式碼。 UserCF演算法(基於使用者的協同過濾演算法): 令N(u)表示使用者u的正反饋的物品集合,令N(v)表示使用者v的正反

個性化推薦演算法------基於內容的推薦和基於的協同過濾

這篇文章主要討論了個性推薦演算法中,基於內容推薦和基於鄰域的協同過濾推薦的分析比較。 資料集:使用者對電影的歷史評價記錄,只有喜歡與不喜歡,喜歡用1表示,不喜歡用2表示,格式如下: 使用者歷史電影評分

推薦系統實踐 0x06 基於的演算法(1)

# 基於鄰域的演算法(1) 基於鄰域的演算法主要分為兩類,一類是基於使用者的協同過濾演算法,另一類是基於物品的協同過濾演算法。我們首先介紹基於使用者的協同過濾演算法。 ## 基於使用者的協同過濾演算法(UserCF) 基於使用者的協同過濾演算法是最古老的演算法了,它標誌著推薦系統的誕生。當一個使用者甲需要個

推薦系統實踐 0x07 基於的演算法(2)

# 基於鄰域的演算法(2) 上一篇我們講了基於使用者的協同過濾演算法,基本流程就是尋找與目標使用者興趣相似的使用者,按照他們對物品喜好的對目標使用者進行推薦,其中哪些相似使用者的評分要帶上目標使用者與相似使用者的相似度作為權重來計算。但是,基於使用者的協同過濾演算法存在一些弊端,如計算使用者興趣相似度矩陣將越

推薦系統:矩陣分解與的融合模型

critical with 分析 但是 rac 公式 download pearson 情況 推薦系統通常分析過去的事務以建立用戶和產品之間的聯系,這種方法叫做協同過濾。 協同過濾有兩種形式:隱語義模型(LFM),基於鄰域的模型(Neighborhood models)。

opencv學習-遍歷影象和

1.銳化運算元計算方式:sharpened_pixel=5*current-left-right-up-down 將一幅影象減去它經過拉普拉斯濾波之後的影象,這幅影象的邊緣部分將得到放大。 2.saturate_cast(防止溢位)函式的作用是:當運算完之後,結果為負,則轉為零,結果超出25

【OpenCV入門教程之八】線性濾波專場:方框濾波、均值濾波與高斯濾波

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

netty原始碼閱讀之解碼之基於長度解碼器引數分析

這篇文章我們放鬆一點,只分析基於長度域解碼器的幾個引數, lengthFieldOffset :長度域的偏移量,也就是長度域要從什麼地方開始 lengthFieldLength:長度域的長度,也就是長度域佔多少個位元組 lengthAdjustment:長度域的值的調整

netty原始碼閱讀之解碼之基於長度解碼器分析

基於長度域解碼器LengthFieldBasedFrameDecoder我們主要分析以下三點: 1、計算需要抽取的資料包的長度 2、跳過位元組邏輯處理 3、丟棄模式下的處理 首先原始碼還是LengthFieldBasedFrameDecoder的decode方法:

【OpenCV入門教程之八】線性濾波專場 方框濾波 均值濾波與高斯濾波

本系列文章由@淺墨_毛星雲 出品,轉載請註明出處。 寫作當前博文時配套使用的OpenCV版本: 2.4.8本篇文章中,我們一起仔細探討了OpenCV影象處理技術中比較熱門的影象濾波操作。影象濾波系列文章淺墨準備花兩次更新的時間來講,此為上篇,為大家剖析了“方框濾波“,”均值濾波“和”高斯濾波“三種常見線性鄰域

【OpenCV】8種子填充法剔除短連通的高效演算法

//本文件參考種子填充演算法描述及C++程式碼實現(https://www.bbsmax.com/A/amd0AVWzge/)講解的原理,實現快速種子填充演算法,執行效果高。 //具體功能如下:依次掃描每個畫素,檢測8領域,尋找連通域,刪掉面積小於閾值的。 #define IMG_MARGIN

、鄰接、通路、連通、連通集、區域概念區分

    有些概念就是這樣,剛開始挺明白,後來長時間不看越來越模糊,都混成一團了,這裡重新總結一下。     1.鄰域:數字影象中,鄰域分為4鄰域和8鄰域,4鄰域就是某個(x,y)點的上下左右四個點,8鄰域再加上左上右上左下右下四個點。如果p在q周圍的8個點內,就是p在q的

opencv實現影象均值濾波、中值濾波、高斯濾波

void CCVMFCView::OnBlurSmooth()//鄰域均值濾波 { IplImage* in; in = workImg; IplImage* out = cvCreateImage(cvGetSize(in),IPL_DEPTH_8U,workImg-&g

畫素間的一些基本關係(、連通)

1、(1)相鄰畫素的關係:4鄰域、D鄰域、8鄰域       (2)連通性:4連通、8連通、m連通       (3)距離 2、鄰域:影象中的各個畫素都是相關的,每個畫素和鄰域具有相同或者相似的一些特性,對此,可以進行影象的分割處理 (1)4鄰域N4(p):畫素p(x,y)

【OpenCV影象處理入門學習教程四】基於LoG運算元的影象邊緣檢測

一、基於LoG運算元的影象邊緣檢測原圖:1.LoG運算元與自定義濾波運算元進行比較的結果:2.LoG運算元的結果:3.自定義3*31 1 1 1 -8 1 1 1 1 濾波結果:二、程式碼解析下面是一段基於LoG運算元的影象邊緣檢測的程式碼,同時會生成兩個結果,一個是LoG運算元的結果,第二個是自