Ask Your Question
0

After subraction of 4 neighbor pixels always give zero

asked 2013-11-24 06:21:35 -0600

zulfiqar gravatar image

I am trying to take difference of center pixel with 4 neighbor and add them and then replace the original with that difference value. but it always replace pixel with zero. I don't what i am doing wrong. thanks for any help

// newproject.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include "highgui.h"
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <conio.h>
#include <opencv2/imgproc/imgproc.hpp>  // Gaussian Blur
#include <opencv2/core/core.hpp>        // Basic OpenCV structures (cv::Mat, Scalar)
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <conio.h>     using namespace cv;
 using namespace std;

  class frameprocessing{

  Mat hsv_base;
  MatND hist_base;

  public:
  void whatever(Mat Frame)
  {
    for(int i=0;i<Frame.cols;i++)
        for(int j=0;j<Frame.rows;j++)
        {
            if(i==0&&j==0)
            {

            //  cout<<"Check 1"<<endl;
                Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i)-(Frame.at<Vec3b>(j+1,i))+(Frame.at<Vec3b>(j,i)-Frame.at<Vec3b>(j,i+1))+(Frame.at<Vec3b>(j,i)-Frame.at<Vec3b>(j+1,i))+(Frame.at<Vec3b>(j,i)-Frame.at<Vec3b>(j,i+1)));

                Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[0]/4;
                Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[1]/4;
                Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[2]/4;

            }
            else if(i==Frame.cols-1&&j==Frame.rows-1)
            {
            //  cout<<"Check 2"<<endl;
                Frame.at<Vec3b>(j,i)=((Frame.at<Vec3b>(j-1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i-1)+Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j-1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i-1)+Frame.at<Vec3b>(j,i)));
                Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[0]/4;
                Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[1]/4;
                Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[2]/4;
            }
            else if(i==Frame.cols-1&&j==0)
            {
                                      //cout<<"Check 3"<<endl;
                Frame.at<Vec3b>(j,i)=((Frame.at<Vec3b>(j+1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i-1)+Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j+1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i-1)+Frame.at<Vec3b>(j,i)));
                Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[0]/4;
                Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[1]/4;
                Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[2]/4;
            }
            else if(i==0&&j==Frame.rows-1)
            {
            //  cout<<"Check 4"<<endl;
                Frame.at<Vec3b>(j,i)=((Frame.at<Vec3b>(j-1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i+1)+Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j-1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i+1)+Frame.at<Vec3b>(j,i)));
                Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[0]/4;
                Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[1]/4;
                Frame.at ...
(more)
edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted
2

answered 2013-11-24 08:25:43 -0600

If you take the neighbors of a pixel, without to much noise, you probably have a little difference, something like 1 or 2. Therefore, if you subtract all the neighbors, you necessarily will get something negative. See, if your value is 24. the neighbors are 25, 24, 23, 11, you get: 24 - 25 - 23 - 11 = -35. The results is saturated cast into 0.

What is the point of subtracting neighbors and replace it in the image? You always will get something negative (or cast to zero in your case)? Moreover, as you replace the pixel value, the results is order dependent, and hard to interpret, as you subtract in the next round, the negative value of the previous neighborhood (- -35).

By the way, next time please submit only the relevant part of your code... ;-)

edit flag offensive delete link more

Comments

now what i have to change in my code ? when i use vec3d instead of vec3b my code get crashed

zulfiqar gravatar imagezulfiqar ( 2013-11-24 08:33:07 -0600 )edit

You picture is in char, so you don't have to change your accessors. You could create an another image (possibly in float) and save the results on it. But you could also used a sum of absolute difference and ensure everything is below 255. It depends on your process and what you want to do with it.

Mathieu Barnachon gravatar imageMathieu Barnachon ( 2013-11-24 08:35:58 -0600 )edit

Mat newimage= Mat(Frame.rows,Frame.cols,3); newimage.at<Vec3b>(j,i)=Frame.at<Vec3b>(j,i)-Frame.at<Vec3b>(j+1,i)- Frame.at<Vec3b>(j,i+1)- Frame.at<Vec3b>(j-1,i)- Frame.at<Vec3b>(j,i-1);

zulfiqar gravatar imagezulfiqar ( 2013-11-24 08:46:08 -0600 )edit

Question Tools

Stats

Asked: 2013-11-24 06:21:35 -0600

Seen: 181 times

Last updated: Nov 24 '13