2

I'm doing image processing on computed tomography projection images. There's a specific type of artifact that results from the processing I'm doing which manifests as a vertical line going through the whole image:

Line artifact

I'm currently detecting it by comparing the mean of each column. If the mean is less than half the mean of both the left side and the right side column neighbours, then the column is deemed as a line artifact. It is then interpolated as the maximum of the left and right side neighbour pixels.

The interpolation works well (right side of the image), but the detection is too ad hoc. It also fails pretty often, as many of the columns containing only the black background can fulfill that condition due to the heavy Poisson noise apparent. This causes artifacts in filtering out the noise which is the next phase. I'm using BM3D with great results and do not wish to median filter the whole image.

Can you think of a better way to detect these 'line artifacts'? Note the strong borders of the objects in the images and the heavy noise included also in the artifact.

Tapio
  • 1,502
  • 1
  • 12
  • 24
  • 1
    Ah, those detector arrays breaking.... So common in CT! – Ander Biguri Feb 16 '17 at 16:07
  • 1
    As those images are CT, I believe always the error will be vertical lines. Have you tried an vertical edge detection filter? Something like `conv2(img,[-1 0 1])`? This will create 2 vertical white lines next to your black lines. These are probably easier to deal with. Also, and sorry to be saying this again: Iterative algorithms will probably help in reducing the effect of those lines in the recosntruction – Ander Biguri Feb 16 '17 at 16:21
  • 1
    Sure, I agree! I'm also witnessing beam-hardening like behavior although I have a spectral model in place, and I'm having some NLPV-problems. So I'm looking at different reconstruction techniques too. But one problem at a time. The vertical filter is a good start, I'm editing the question. – Tapio Feb 16 '17 at 16:34
  • Are the lines solid black (due to missing data) or is there noise on them as well? In general, it calls for computing a gradient over columns, collecting it (its magnitudes) over rows and then thresholding for peaks? Maybe after running an edge detection filter as Ander suggested? – Florian Feb 16 '17 at 16:42
  • @Florian They will have value. Zoom in the image. – Ander Biguri Feb 16 '17 at 16:45

1 Answers1

3
  1. We want to find vertical lines in the image so first convolve the image with the filter [1 -2 1]. This will give high values for pixels that are lower than their vertical neighbors.
  2. Sum all the columns of the image.
  3. Find the index of column with the maximum value. This column is the problematic one.
Rethunk
  • 3,976
  • 18
  • 32
Amitay Nachmani
  • 3,259
  • 1
  • 18
  • 21
  • "Sum all the columns", you mean sum all the rows? – Florian Feb 16 '17 at 16:43
  • No. I mean columns. After step 1 the pixels on the vertical lines will have high values so summing all those values vertically (the colum) will give high value. – Amitay Nachmani Feb 16 '17 at 16:45
  • Okay, I misunderstood. Sum all the columns sounds like form a sum over all the columns (i.e. over the column index). You mean: for each column, sum all entries of the column (i.e., sum over rows). Slightly ambiguous to me, but maybe that's just me. – Florian Feb 16 '17 at 16:57
  • This works great. There might be 0 to N artifacts. Luckily the mean of artifact columns is orders of magnitude higher, so detecting the number of artifacts in 3. is easy. – Tapio Feb 16 '17 at 17:14