How to obtain the chain code

In the previous post I discussed simple techniques to estimate the boundary length of a binarized object. These techniques are based on the chain code. This post will detail how to obtain such a chain code. The algorithm is quite simple, but might not be trivial to understand. Future posts will discuss other measures that can be derived from such a chain code.

In short, the chain code is a way to represent a binary object by encoding only its boundary. The chain code is composed of a sequence of numbers between 0 and 7. Each number represents the transition between two consecutive boundary pixels, 0 being a step to the right, 1 a step diagonally right/up, 2 a step up, etc. In the post Measuring boundary length, I gave a little more detail about the chain code. Worth repeating here from that post is the figure containing the directions associated to each code:

Chain codes

The chain code thus has as many elements as there are boundary pixels. Note that the position of the object is lost, the chain code encodes the shape of the object, not its location. But we only need to remember the coordinates of the first pixel in the chain to solve that. Also note, the chain code encodes a single, solid object. If the object has two disjoint parts, or has a hole, the chain code will not be able to describe the full object.

Image to chain code

Let’s assume we have a binary image with a single object in it. Using DIPimage, we could generate a suitable test image thus:

img = rr<30;

The algorithm also needs an array with the definition of each of the chain codes. Call this a “cipher” if you will. Indexing in this array with one code from the chain gives the change in coordinates as you go from one pixel to the next:

directions = [ 1, 0
               1,-1
               0,-1
              -1,-1
              -1, 0
              -1, 1
               0, 1
               1, 1];

Thus, directions(cc+1,:), where cc is one code from the chain, yields the [x,y] increment for the coordinates. The +1 is necessary because MATLAB indexing starts at 1, whereas the first code is 0.

The algorithm starts at any pixel that is on the object’s boundary. We will use MATLAB’s function find to find the first “on” pixel in the image:

indx = find(dip_array(img),1)-1;

We subtract one from the index to obtain 0-based indices, which are much easier to use than MATLAB’s 1-based indices. Next we convert this index into image coordinates:

sz = imsize(img);
start = [floor(indx/sz(2)),0];
start(2) = indx-(start(1)*sz(2));

MATLAB is column-major, meaning that indices increase downward first. The function find returned the first object pixel using this column-major indexing, meaning that none of the columns to the left have any object pixels, and in this column, none of the pixels above have any object pixels. The boundary possibly continues downward on one side, and up/right on the other side. That is, from this point the possible steps are chain codes 0, 1, 6 and 7. Codes 3, 4 and 5 all point to the column to the left, which we know is empty, and code 2 points up, where we also know the object cannot be. We choose to follow the boundary clockwise (though it is equally valid to define the chain code counter-clockwise if one so wishes), and thus we need to try the possible steps in this order: 1, 0, 7, 6. If the step 1 yields an object pixel, this is the pixel that continues the boundary in the clockwise direction. If this pixel is empty, we try to see if we find the object using step 0, etc. Once the next pixel is found, this step is repeated again and again until we have travelled all the way around the object and return to the initial pixel at coordinates start. However, each next step has different limits for which directions are possible. The first direction to try (the “most clockwise” neighbour, if you will) is the one that is two codes up from the previous step. That is, the boundary makes a 90° left turn. It cannot make a 135° left turn, because that pixel is also a neighbour to the previous pixel, and if the object is there, the previous step would have pointed to it instead. As before, we first try the “most clockwise” step first, then continue down the codes until we find an object pixel. The following code implements this algorithm:

cc = [];       % The chain code
coord = start; % Coordinates of the current pixel
dir = 1;       % The starting direction
while 1
   newcoord = coord + directions(dir+1,:);
   if all(newcoord>=0) && all(newcoord<sz) ...
         && img(newcoord(1),newcoord(2))
      cc = [cc,dir];
      coord = newcoord;
      dir = mod(dir+2,8);
   else
      dir = mod(dir-1,8);
   end
   if all(coord==start) && dir==1 % back to starting situation
      break;
   end
end

The loop above combines the loop over all the neighbours of a pixel (to find the next boundary pixel) and the loop over all the boundary pixels. This makes the code a lot simpler. We have a starting coordinate and a starting direction. Inside the loop, we test the pixel pointed at by this direction. If it contains an object pixel, we add this direction as a code in the chain, set the current pixel to the newly found boundary pixel, initialize the starting direction to the 90° left turn, and continue on with the loop. If the pixel pointed at contains background (or is outside the image domain), we decrease the direction by one and continue on with the loop. The loop continues until we are back at the starting position (that is, at the same coordinates and direction).

As I said before, this algorithm is very simple, though it might be difficult to understand. I recommend you take a paper and a pen and draw out the steps of the algorithm, until you are satisfied that it always works as intended. Also note, for example, the special case of an object with a single pixel: The algorithm looks in all directions once, then meets the finishing requirements and quits. Thus, a single pixel object has 0 elements in the chain code.

Chain code to image

The inverse algorithm, walking over the codes in the chain and drawing the boundary back in the image, is much more trivial. We first create an empty, binary image, then start at coordinates start, and modify the coordinates by adding directions(cc(ii)+1,:), in a loop over ii:

border = newim(sz,'bin');
coords = start;
for ii=1:length(cc)
   border(coords(1),coords(2)) = 1;
   coords = coords + directions(cc(ii)+1,:);
end
joinchannels('rgb',img,border')*255

The final command, joinchannels, overlays the two binary images in colour, the original one in red and the newly drawn boundary in green. Where the two overlap, the pixels appear yellow. As you can see, the whole boundary is yellow, indicating that the pixels represented by the chain code are the boundary pixels of the object.

Just for the MATLAB vectorization aficionados out there, I’ve put together this second version of the last algorithm. See if you can figure out how it works!

stride = [sz(2);1];
step = directions*stride;
indx = cumsum([start*stride;step(cc+1)]);
border = newim(sz,'bin');
border(indx) = 1;

76 Responses to “How to obtain the chain code”

  1. On March 22nd, 2011, at 5:03, Adams Black said:

    Its good and educative. I need more resources to fully comprehend.

  2. On March 22nd, 2011, at 9:54, Cris Luengo said:

    Hi Adams,

    You can check a text book like Sonka, Hlavac & Boyle, or Gonzalez & Woods. But I very much recommend you use the MATLAB debugger to step through the code one line at the time, and see how it operates.

  3. On March 22nd, 2011, at 12:10, Adams Black said:

    Thank you very much.

  4. On October 11th, 2011, at 14:56, SP said:

    can i ask you something? what direction is the [ 1, 0; 1 ,-1; etc?]

    1,0 is right?

    1, -1 is down right? because i don’t understand this.. i understood the 0, 1, 2 , 3…. but not this.

  5. On October 11th, 2011, at 16:12, Cris Luengo said:

    Indeed, (1,0) is right, and corresponds to the 0 chain code; (1,-1) corresponds to the 1 chain code, etc. Thus, directions(cc+1,:) gives the (dx,dy) coordinate increment corresponding to chain code cc. For any set of coordinates (x,y), adding this increment brings you to the coordinates for the next point on the contour: [x,y]+directions(cc+1,:). (Note that y increases down, and thus (0,-1) is the up direction!)

  6. On October 17th, 2011, at 9:28, dina said:

    How can i use the chain code with the array of picture by using VB6?

    With my greating.

    Dina Jamal.

  7. On October 18th, 2011, at 7:45, Cris Luengo said:

    Sorry Dina, I don’t know much about VB6. But I know it is possible to link your VB6 programs to DIPlib, which contains functions to obtain chain codes and compute their length. See http://www.diplib.org/.

  8. On June 7th, 2012, at 6:49, Nivedhitha said:

    I have a mamogram image with cancerous part in particular area of the image. i have the chain code representation of that cancer part. now, how do i extract or seperate the cancer part of the image.i have the starting point of the image how do i get the cancer part of the image using the chain code i have?

  9. On June 9th, 2012, at 9:18, Cris Luengo said:

    Nivedhitha,

    If you use the last bit of code on this post, you will have an image where the border pixels of your cancer are marked. With a command like fillholes(border,1) you will fill in the inner part. Now you have an image where all cancer pixels are marked.

  10. On July 3rd, 2012, at 10:40, Gianna said:

    Hi Cris!

    I’d like to show in one figure my original image (with the object), then the segmentation of that image (just the white object in black background) and the image that came out of the joinchannels, like using a subplot, is that possible??

  11. On July 4th, 2012, at 17:51, Cris Luengo said:

    Gianna,

    Yes, you can, but you have to use standard Matlab handle graphics commands. The DIPimage display will always show only one image per figure window. The function image will show a Matlab array as an image in an axis:

    img = readim;

    bin = threshold(img);

    col = joinchannels('rgb',img,bin);

    figure, colormap(gray)

    subplot(1,3,1), image(dip_array(img));

    subplot(1,3,2), image(uint8(bin*255));

    subplot(1,3,3), image(double(col)/255);

  12. On July 19th, 2012, at 20:59, tina said:

    Cris,

    Hey, so I am traversing a tree like structure and I am trying to figure out what the code would do if it find a new pixel in two different directions- like two different branches? ( I was looking at this part: ““most clockwise” step first, then continue down the codes until we find an object pixel. “) I want to apply recursion. Let me know your thoughts

  13. On July 20th, 2012, at 12:33, Cris Luengo said:

    Tina,

    The algorithm I describe indeed always takes the “most clockwise” step. The algorithm tracks a closed contour, which has no branches. Even if the object itself has branches, and one boundary pixel can have multiple neighbours that are also boundary pixels, there is always one neighbour pixel that is the next one along the contour. There is no need for recursion here.

  14. On September 11th, 2012, at 8:36, tyo said:

    Cris,

    i have an image with selected red edge ellipse, and i don’t know how to obtain chain code for this area

  15. On September 11th, 2012, at 19:57, Cris Luengo said:

    Tyo,

    You need to segment your image, so you know which pixels form the object. How to do this depends very much on the image, there’s no one-size-fits-all algorithm to do this. I recommend reading a book on image analysis for ideas. Once you have that, you can apply the code in this post to get the chain code.

  16. On September 21st, 2012, at 2:30, Dearick said:

    Cris,

    I used your matlab code to obtain the chain code of a binary fire image. I got an output cc. I didn’t fully understand what the output means, so I have to ask you.

    Our goal is to represent the shape of the fire region by retrieving the 8-connected chain code of a given extracted region. A number of points should be used “from the chain code representation

    of the boundary,” and these points were then sent to the fourier domain.

    So, by all means what points/output should I send to the fourier domain? Is it the cc variable?

  17. On September 21st, 2012, at 8:51, Cris Luengo said:

    Dearick,

    The output cc is the chain code. What it means is described in this blog post. You can convert cc to coordinates of boundary pixels, also described in this post. Those coordinates you can then put into a vector and apply the Fourier transform. How to do this should be described in your text book/lecture notes, I’d wager. Good luck with the exercise! 🙂

  18. On September 24th, 2012, at 12:13, Dearick said:

    Cris,

    I successfully got the chain code and sent the coordinates in the fourier domain. But is there a way to get the chain code without the dip image tool? Will processing be faster if the code is converted into a normal matlab code?

  19. On September 25th, 2012, at 8:46, Cris Luengo said:

    Dearick,

    If speed is important, use the DIPlib function to get the chain code: cc = dip_imagechaincode(img,2,1) (with img a labelled image not a binary image, and the last parameter is the label ID of the object to get the chaincode for). It can get multiple chain codes at once, see the help.

    If you want to avoid using the DIPimage toolbox, you could easily convert the code to pure MATLAB; just remember that in DIPimage image objects the indexing starts at 0 and is (x,y), whereas in MATLAB it starts at 1 and is (y,x). Pure MATLAB code will be a little faster, as indexing into a DIPimage image object is slower than indexing into an array.

  20. On February 8th, 2013, at 9:09, Venkateswara Rao N said:

    Dear Sir, How can I compute convex perimeter of a boundary image. I am very thankful for Your favourable reply

  21. On February 8th, 2013, at 12:22, Cris Luengo said:

    Dear Venkateswara,

    Take a look at this page where I explain how to get the convex hull from the chain code. The convex hull is a polygon, and it’s perimeter can be obtained simply by adding the lengths of the sides.

  22. On May 26th, 2013, at 8:02, marino said:

    amazing. very clearly elaborated

  23. On November 12th, 2013, at 15:04, Naddy said:

    Hi Cris,

    Firstly thanks for the thorough explanation of chain code. I wanna ask a few questions:

    1. I have found some similar Matlab code Boundary Tracing : http://www.mathworks.com/help/images/ref/bwtraceboundary.html which I think work similarly like chain code but cannot return the encode except traced contour only. Do u think it can be extended to chain code like algorithm.

    2. Can this algorithm interpret a 2D object as 3D object? For your information, i am working on single pixel wide drawing and try to determine the junction and get the depth value so that can later be used for 3D reconstruction. In other words, do you think chain code one of the suitable technique to derive the 3D information?

    Do you think it can work? Thanks in advance.

  24. On November 12th, 2013, at 15:32, Cris Luengo said:

    Hi Naddy,

    1. Yes, this is more or less the same algorithm, but it returns the coordinates of the pixels. You can then convert the coordinates into a chain code, which is quite simple. Given the output array B, diff(B) is an array where the rows are [1,0], [1,-1], etc. There are 8 of these combinations, each one corresponds to a chain code.

    2. I’m not sure what you’re asking here, but the chain code does not extend to 3D.

  25. On November 13th, 2013, at 1:24, Naddy said:

    Many Thanks Cris for fast replied, I really appreciate those efforts you put on it. Last but not least, Do you have any idea, what is suitable algorithm I may use to interpret 2D line drawing, maybe you have something in your mind. As I mentioned previously now I processing the line drawing to be converted to 3D object by using Matlab. In other words, I am working on a line drawing interpreter, and the main objective is to derive the depth (Z) value from this 2D line drawing. Just share your idea if you have it. Again Thanks Cris.

  26. On November 13th, 2013, at 11:40, Cris Luengo said:

    Hi again Naddy,

    Your problem doesn’t sound trivial at all. You could try the Hough transform (hough, houghpeaks, houghlines) to find the lines in your drawing. Interpreting the 3D object represented would then require quite a bit of logic…

  27. On November 25th, 2013, at 4:52, Naddy said:

    Hi again Cris, Now I’m successfully installed the DipLib and run the chain code program.One simple question, What is meant by img=rr<30;. So Let say I have my own image, I just need to import my image by using toolbox appeared after run the dipstart.m?

    Sorry, i have to ask this simple question due to insufficient time. Really appreciate on your assistance

    Thanks again

  28. On November 25th, 2013, at 12:55, Cris Luengo said:

    Hi Naddy,

    img=rr<30 creates the test image. rr is an image where each pixel's value is the distance to the origin.

    To read in your own image, use readim. You then probably need to threshold it to make it into a binary image.

  29. On November 25th, 2013, at 14:30, Naddy said:

    Thanks Cris,

    Now I am using readim to import my thinned image, but No chain code series returned.

    I think it should be workable since it binary image with single line drawing closed contours .

    Many thanks again Cris, Now I am near to obtain chain code.Just a matter of an image now

  30. On November 25th, 2013, at 16:20, Naddy said:

    Cris, sorry my disturbing again. Now I can apply my own image after applied the imfill function to fill the holes. However, this algorithm just managed to trace external boundaries isnt? how about internal boundaries?

  31. On November 26th, 2013, at 11:51, Cris Luengo said:

    Hi Naddy,

    The chain code algorithm as described here traces the external boundary. You can start it at a pixel on an internal boundary, and it will trace that. But there is no way of encoding multiple boundaries in one chain.

    If you just want to trace all the boundaries, without using any chain codes, you can simply do bdilation(img,1)-img) or img-berosion(img,1).

  32. On January 26th, 2014, at 12:54, Ash said:

    Sir,
    I am getting an error if i try to use my own image for this code. The error is
    Undefined function ‘dip_array’ for input arguments of type ‘uint8’.
    Please tell me what do i have to change.

    Thanks in advance

  33. On January 26th, 2014, at 16:38, Cris Luengo said:

    Ash,
    That is because img is expected to be a dip_image object.
    Start with img=dip_image(img), then run the other commands in the post.

  34. On January 28th, 2014, at 8:18, Ash said:

    Sir,

    I am getting an error in dimensions and i am new to this, So please tell me what to do?

    “Error using =0) && all(newcoord<sz)

  35. On January 28th, 2014, at 8:20, Ash said:

    Sir,

    I am getting an error like:

    “Error using > (greater than symbol)

    Matrix dimensions must agree.”

    Please tell me what to do.

  36. On January 28th, 2014, at 11:29, Cris Luengo said:

    Ash,
    I’m not sure what problem you run into, given the information you give, it could be any number of things. Have you installed DIPimage? Is your input image two-dimensional and binary?

  37. On January 29th, 2014, at 10:52, Ash said:

    Yes it is two-dimensional but not binary. Should i change it to binary first.. I have installed DIPimage..

  38. On January 29th, 2014, at 15:56, Cris Luengo said:

    Yes, the code expects a binary image as input. try the threshold function.

  39. On March 8th, 2014, at 19:12, varun said:

    sir,

    Is there any algorithm that I can use to convert binary bits to geometrical shape format and again retrieve bits back ? Can we use chain code fo that ?As i’am newbies for this fiels sorry if i’am wrong.

  40. On March 10th, 2014, at 16:33, Cris Luengo said:

    Varun,

    The code on this page shows how to convert a pixel-based representation of a binary object to a polygonal boundary representation, and back again. I’m not sure what else you are looking for.

  41. On April 2nd, 2014, at 15:31, Turi said:

    Hi Cris;

    I try to measure the lengths of interfacial area in a polymermix. Can I do that with chain code ?

    I did it with simple Imaging Processing Toolbox codes and it is good if I have solid objects

    Belove you can see some picture of my study

    Regards

    http://imageshack.com/a/img29/3469/iw0q.jpg

    http://imageshack.com/a/img33/651/upm7.jpg

    http://imageshack.com/a/img833/7417/8mgk.jpg

  42. On April 2nd, 2014, at 16:06, Cris Luengo said:

    Hi Turi,

    I’m sure you can do this with chain codes. I guess you are having trouble measuring the length of the ‘inner’ boundaries. Note that you can start the chain code algorithm at any pixel in your image. If you start it at one of the ‘inner’ boundaries you’ll get the chain code for that contour.

    Good luck!

  43. On April 2nd, 2014, at 16:27, Turi said:

    Hi Chris ;

    You wrote”The chain code encodes a single, solid object. If the object has two disjoint parts, or has a hole, the chain code will not be able to describe the full object

    I have this problem with my own codes.

    B = bwboundaries(D,8,’noholes’);

    imshow(D); hold on;

    for k=1:length(B),

    boundary = B{k};

    plot(boundary(:,2),…

    boundary(:,1),’r’,’LineWidth’,2);

    end

    x=boundary(:,2);

    y=boundary(:,1);

    My plot follow the border and come back to the start point. Is there any solution for it ?

    Because as you see a mixture is very confusing and I dont any idea where start my plot or where end?

    Thank you so much

  44. On April 2nd, 2014, at 19:59, cdh said:

    How to apply these for regular images, without using DIPimage toolbox?

  45. On April 3rd, 2014, at 8:04, Cris Luengo said:

    Turi,

    I’m not sure what the problem is. The chain code algorithm I posted follows a single, closed contour. There is a bit of code first that looks for the first object pixel in the image. From there on, it follows the contour. If you change this start point, it will follow another contour, even one that is inside an object. Just pick any start point on each of the contours you want to measure, and compute the chain codes from those points.

  46. On April 3rd, 2014, at 8:08, Cris Luengo said:

    cdh,

    It should not be difficult to rewrite the code here to be plain MATLAB. Sorry I cannot help with that.

  47. On December 18th, 2014, at 19:05, fatima said:

    Hi Chris

    i need to detection the point in image and mesurments distance in image foot…how us chain code to detection point in image,,,,thanks

  48. On December 19th, 2014, at 11:39, Cris Luengo said:

    Fatima,

    The chain code is not useful for detection, you can only use it once you have detected your object.

  49. On March 6th, 2015, at 18:42, rohayu said:

    hii i wana ask..how to obtain the chaincode of many objects in an image?

  50. On March 7th, 2015, at 21:55, Cris Luengo said:

    Easiest is to label the image (connected component analysis that assigns the same object ID to each pixel belonging to the same connected component), and then run the algorithm described here once for each object.

  51. On March 8th, 2015, at 17:58, rohayu said:

    hi cris,
    i’ve tried to apply CCL to the objects but there are too many errors.. can u help me a little bit? is it possible to get chaincode staright away without applying CCL first?

  52. On March 8th, 2015, at 20:05, Cris Luengo said:

    Rohayu,

    Try this in MATLAB with DIPimage:

    img = threshold(readim('cermet'));
    img = label(img);
    cc = dip_imagechaincode(img,2,[]);

    cc will be a struct array with a chain code for each object in img.

  53. On March 10th, 2015, at 18:28, rohayu said:

    hi cris

    currently i’ve conducted a project of classifying normal and abnormal red blood cell. but i got stuck on the same problem. is this source code possible to label the image coz ive run the source code ur given..but still cant run?

    i=imread(‘imagecrop.png’);

    c=rgb2gray(i); %conversion to gray

    %imshow(i);

    l=graythresh(c);%threshold value for getting a binary image

    f=im2bw(c,l); %converting the grayscale image to binary vth reference to the threshold level

    x=bwareaopen(f,40000); %to remove the xtra noise nd defining the area,area cud be found out by using imtool

    imshow(x);

    [q,n]=bwlabel(x,4); %label connected components in 8×8 pixels(not more than 8),n=no.of objects

    graindata=regionprops(q,’basic’);

    for j=1:5

    a = graindata(j).Centroid;

    a = round(a);

    y = a(1)

    x = a(2)

    rectangle(‘Position’,[y-4 x-4 8 8],’EdgeColor’,’r’);

    drawnow;

    end

  54. On March 10th, 2015, at 21:55, Cris Luengo said:

    Rohayu,

    I don’t know what problem you get stuck on, or what errors you are getting, so I cannot help you. If you want help, you need to be specific!

    Note that the code I’ve posted requires DIPimage. Did you install DIPimage?

  55. On March 11th, 2015, at 11:15, Ganesh said:

    Dear sir

    I am working on the “Lung segmentation in CT scan images”, Initially i have applied the adaptive thresholding in MATLAB for the lung segmentation and obtain the binary image from it, Now i have to Extract the Lung Boundary by applying bidirectional chain code (In horizontal & vertical Direction). But I don’t know how to apply this bidirectional chain code in MATLAB.

    I would like to Know how to obtain the bidirectional chain code of the o/p binary image..? and How to trace the boundary from the obtained chain code on the output Binary image ?

    Thanks in Advance

  56. On March 11th, 2015, at 13:53, Cris Luengo said:

    Ganesh,

    If this “bidirectional chain code” is something different from what I describe on this page, you’ll have to find another source explaining it. Did you search the literature?

  57. On March 12th, 2015, at 7:00, Ganesh said:

    Dear Sir

    Thanks for your reply, Yes sir i have searched the literature. In the bidirectional chain code number number corresponding to the direction from one pixel (i) to the next (i+1) in a chain, c(i) belongs to {0, 1, -1}, where i represents the index value for the pixel. The assigned code word for each direction is based on the Horizontal and vertical encoding coordinate system. The details procedure is mentioned in the following steps.

    Step 1: Horizontal code word generation, In this Horizontal code word generations the encoder moves along the boundary in the clockwise way.

    Step 2: Arrow map generation, An arrow map is generated to represent the directions that the encoder moves.

    Step 3: Code word Assignment, A code word is assigned to each arrow according to Horizontal coordinate encoding system.{ Horizontal encoding coordinate system is : If f(x,y) is the center pixel then the Horizontal encoding coordinate system is like this [f(x,y+1)=-1, f(x+1,y-1)=-1, f(x,y-1)=0, f(x-1,y-1)=1, f(x,y-1)=1, f(x-1,y+1)=1, f(x,y+1)=0, f(x,y+1)=0]}

    Step 4: Vertical code word generation, The vertical code word is generated in similar manner, but using the vertical encoding coordinate system. { Vertical encoding coordinate system is : [f(x,y+1)=0, f(x+1,y-1)=1, f(x,y-1)=1, f(x-1,y-1)=1, f(x,y-1)=0, f(x-1,y+1)=-1, f(x,y+1)=-1, f(x,y+1)=-1]}

    Please help me to solve this problem, Thanks in Advance

  58. On March 12th, 2015, at 9:35, Cris Luengo said:

    Ganesh,

    I fail to see what the problem is. This cannot be difficult to implement.
    You are not expecting me to write code for you, are you?

  59. On March 12th, 2015, at 10:18, Ganesh said:

    Dear sir

    thank you once agin for your reply. I will try to implement it, I was not expecting you to write code for me.

    i just wanted to know the procedure for finding bidirectional chain code & also wanted to know, how to trace the boundary from the obtain chain code.

  60. On March 12th, 2015, at 10:29, Cris Luengo said:

    Ganesh,

    It seems to me that this “bidirectional chain code” you obtain the same way as I describe above, but instead of writing down a number between 0 and 7, you write down the change in x or y coordinates. Chain code 0 = [1,0], chain code 1 = [1,1], etc. Basically, the step array in the last bit of code. There you also see how to convert this back to pixel indices, so you can draw the boundary over your image.

  61. On March 12th, 2015, at 11:08, Ganesh said:

    Thank You so much it will solve my problem.

  62. On March 19th, 2015, at 17:06, Mani said:

    Hello Cris

    I would like to know can we apply the chain code to the object given in the link below..? Because as per the information given in your blog, Chain code will not able to describe the full objects are disjoint.

    If it is possible to find the chain code then, How to find the starting point of this two objects. How to draw the boundary back in the image using MATLAB ..?

    The Input binary image is given in this link

    https://imageshack.com/i/f0ivqBORp

    If you answer this question it would be great help for me. Thanking you

  63. On March 19th, 2015, at 21:55, Cris Luengo said:

    Mani,

    Please see above a question asked on this page about two weeks ago. The solution is to do connected component labelling, then find the first pixel with value 1, first pixel with value 2, etc., and get the chain code starting at each of these. Drawing the boundaries back into the image works the same as with a single chain.

  64. On March 20th, 2015, at 6:41, Mani said:

    Thank you very much.

  65. On March 20th, 2015, at 9:30, ryu said:

    hi how to get shape index of images?

  66. On March 24th, 2015, at 8:24, Shivadatt CHame said:

    Hello sir,

    i want to implement chain code on Character image R but i dont know how to apply chain code on Character image….

    please give some idea about Freeman chain code on image….basic procedure…

    thnks

  67. On March 24th, 2015, at 10:23, Cris Luengo said:

    Ryu,

    There are many shape descriptors for objects. One of the better known ones is the circularity, a normalised ratio of area divided by the square of the perimeter. See elsewhere in this blog how to compute those.

  68. On March 24th, 2015, at 10:24, Cris Luengo said:

    Shavidatt,

    The basic procedure is outlined in this post, I don’t understand what you’re asking me.

  69. On March 24th, 2015, at 13:28, Shivadatt CHame said:

    Respected sir,

    i want to detect the curve of R character image using chain code….how to do this….

    please give me procedure for apply chain code on character image if i dont want to use DIPImage toolbox….

    suggest me…

  70. On March 25th, 2015, at 9:32, Cris Luengo said:

    Shividatt,

    Sorry, the procedure is described above, I’m sure it’s not difficult to rewrite the code in any other language.

    I hope you’re not expecting me to write code for you or to do your homework for you!

  71. On April 1st, 2015, at 13:02, Shivadatt said:

    Respected sir,

    when i run above chain code the figure(1),figure(2)……display gain an again how to stop this…..i want to display only one chain code image. how to do this….

    and i use another method also fchcode() but i am getting only chain code….how to display original image using chain code……

    please help me….

  72. On April 2nd, 2015, at 9:25, Shivadatt Chame said:

    Respected sir,

    when i run above chain code i am getting image but the image is displayed again an again figure(1),figure(2)… and pixel marker above image…..how to stop this

    sir is this possible chain code of same image can be different….

  73. On April 2nd, 2015, at 9:50, Shivadatt Chame said:

    Respected sir,

    when i run below code:

    I=imread(‘thinning.jpg’);

    c=fchcode(I)

    i got the error at fchcode() input curve is broken…..please how to solve this problem

  74. On April 2nd, 2015, at 10:38, Cris Luengo said:

    Shivadatt,

    Writing the same comment twice is not going to get you a reply faster.

    If you don’t want MATLAB to show the output, add a semicolon (;) to the end of the command.

    You can get different chain codes from the same image: if there are different boundaries, each boundary yields a valid chain code. Also, depending on the start point along the boundary, the chain code will look different (it will simply be a rotated version of the same code).

    I have no idea what fchcode is, how could I possibly help you with it???

  75. On October 28th, 2015, at 7:21, Naarani said:

    Sir I have to find the chain code direction between two given points.. Please help me with this..

    Thank You..

  76. On October 29th, 2015, at 21:39, Cris Luengo said:

    Naarani,

    I’m not sure what you’re asking. If the points are neighbours, you can find the chain code for the step using the lookup table in this post. If the points are further apart, you could consider drawing a line between the two (search for my blog post on Bresenham lines) and use the code in this post to get the chain code.

Leave a Reply

You can use these HTML tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Note: I moderate all comments. Comments without a clear relation to the text above will not be published.