2016-05-25 13 views
-2

私はopencv(C++)の新機能です。このX線画像から水平線を削除したいと思います。でも、私は出来ません。このX線画像から水平線を削除するにはどうすればいいですか?

これらは私の画像です:

enter image description here

このタスクを解決する方法についてどのような考えを示唆していますか?または、インターネット上のどのリソースでヘルプを見つけることができますか?

これは単なるアイデアだ私のC++コード

src = imread("C:/Users/Alireza/Desktop/New folder (3)/11.bmp"); 
cvtColor(src, gray, CV_RGB2GRAY); 
imshow("Original Image", gray); 
imwrite("Original Image.png", gray); 
normalize(gray, gray, 0, 250, NORM_MINMAX, -1, Mat()); 
threshold(gray, thresh, 170, 255, THRESH_BINARY_INV); 
vector< vector <Point> > contours;   
vector<Vec4i> hierarchy; 
int largest_contour_index = 0; 
int largest_area = 0; 
Mat alpha(src.size(), CV_8UC1, Scalar(0)); 
findContours(thresh, contours, hierarchy, CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
for (int i = 0; i< contours.size(); i++)         
{ 
double a = contourArea(contours[i], false); 
if (a>largest_area) 
{ 
largest_area = a; 
largest_contour_index =  i;                 
} 
} 
drawContours(alpha, contours,  largest_contour_index,Scalar(255),CV_FILLED, 8, hierarchy);   
vector<Mat> rgb; 
split(src, rgb); 
Mat rgba[4] = { rgb[0], rgb[1], rgb[2], alpha }; 
merge(rgba, 4, Tafrigh); 
imshow("Tafrigh", Tafrigh); 
imwrite("Tafrigh.png", Tafrigh); 
+0

あなたはhttp://s000.tinyupload.com/index.php?file_id=60368569977646932463とhttp://s000.tinyupload.com/index.php?file_idに複数の画像を見ることができます= 17335973361892920384。 –

+1

あなたの質問には、コードと多分画像も含まれているはずです。あなたのコードを見るために、私はファイルをダウンロードしません。 – user463035818

+1

@ tobi303:自分のコードを挿入することはできません。システムで私のコードを挿入することはできません!そのページのcode.cppをクリックすれば開くことができます。 –

答えて

2

は、スペクトルを見て、2次元FFTを取る読むことができます。中心のy軸に沿ってたくさんの点が表示されます。これらの点を抑制し、逆変換し、垂直線はなくなります。

結果(私はC++とopencvがインストールされていないので)の下では、Pythonでスライダを使用して抑制する領域を変更します。それを擬似コードとみなしてください。わかりやすくするために、ここでは抑制されたピクセルとその隣接ピクセルとの間のスムーズな移行を行っていないので、これはまだかなり荒いです。

%matplotlib inline 
from __future__ import division 
import numpy as np 
import matplotlib.pyplot as p 
from ipywidgets import * 

from scipy import misc 
f = misc.imread('xray_image_with_horizontal_lines.png') 

a=np.fft.fftshift(np.fft.fft2(f)) 

def process(kx,ky): 
    p.figure(figsize=(12,8)) 
    p.subplot(221) 
    p.imshow(f, cmap=p.cm.gray) 
    p.subplot(222) 
    p.imshow(np.abs(np.log(a)), cmap=p.cm.gray) 

    print np.shape(a) 
    b=np.zeros_like(a) 
    for i in range(639): 
     for j in range(406): 
      if not (320-kx<i<320+kx and (j<203-ky or j>203+ky)): 
       b[j,i]=a[j,i] 

    c=np.fft.ifft2(b) 
    p.subplot(223) 
    p.imshow(np.abs(np.log(b)), cmap=p.cm.gray) 
    p.subplot(224) 
    p.imshow(np.abs(c), cmap=p.cm.gray) 

interact(process, kx=[1,20,1],ky=[1,20,1]) 

enter image description here

1

:平均ラインを一定に保ちます。

cv::Mat image = cv::imread("Tf6HO.png",CV_LOAD_IMAGE_GRAYSCALE); 
vector<double> moyenne; 
double minval,maxval; 
minMaxLoc(image,&minval,&maxval); 
imshow("original",image); 
for (int i = 0; i < image.rows; i++) 
{ 
    double s=0; 
// Caluclate mean for row i 
    for (int j=0;j<image.cols;j++) 
     s += image.at<uchar>(i,j); 
// Store result in vector moyenne 
    moyenne.push_back(s/image.cols); 
} 
// Energy for row i equal to a weighted mean of row in [i-nbInf,i+nbSup] 
int nbInf=32,nbSup=0; 
for (int i = 0; i < image.rows; i++) 
{ 
    double s=0,p=0; 
    // weighted mean (border effect process with max and min method 
    for (int j = max(0, i - nbInf); j <= min(image.rows - 1, i + nbSup); j++) 
    { 
     s+=moyenne[j]*1./(1+abs(i-j)); 
     p+=1./(1+abs(i-j)); 
    } 
    // Weighted mean 
    s/=p; 
    // process pixel in row i : mean of row i equal to s 
    for (int j=0;j<image.cols;j++) 
     image.at<uchar>(i,j) =saturate_cast<uchar>((image.at<uchar>(i,j)-moyenne[i])+s); 
} 
imshow("process",image); 
waitKey(); 

result かと解像度 enter image description here

を減らすあなたが改善したい場合は、このpaperと目録

+0

@ LBerger:ありがとうございました。可能であれば、あなたのコードに整数 "nbInf" - "nbSup" - "Energy"を説明し、 "平均線定数を保つ"アルゴリズムを説明してください。 –

+0

原則は、1 - >平均線(6-14行)定数と2 - >ですが、平均線は、隣の次の平均線です:加重平均線は推定​​されます – LBerger

+0

@ LBerger:ありがとうございました。私は画像処理で新しく、あなたのアルゴリズムを理解していません。私はあなたのアルゴリズムを完全に私の友人のために説明したいが、それはできない。可能であれば、私のアルゴリズムを完全に説明することができます。どうもありがとう。 –

関連する問題