Welcome To Azteca's Blog

Jumat, 20 Desember 2013

HISTOGRAM


          Definisi Histogram secara umum adalah grafik balok yang memperlihatkan satu macam pengukuran dari suatu proses atau kejadian. Grafik ini sangat cocok untuk data yang dikelompokkan.



          Namun dalam dunia pengolahan citra, Histogram dapat diartikan sebagai representasi grafis untuk distibusi warna dari citra digital atau menggambarkan penyebaran nilai-nilai intensitas pixel dari suatu citra atau bagian tertentu dalam citra.

          Dengan demikian Histogram dapat digunakan untuk berbagai macam kegunaan agar membatu proses pengolahan citra, seperti pengumpulan suatu data dari sebuah citra.

          Kelompok kami menggunakan Histogram untuk memperolah data dalam sebuah citra, dengan cara menditeksi pixel berwarna merah, biru, hijau dengan menggunakan histogram dengan demikian akan ada 1 buah histogram untuk masing-masing pixel.
 


 Contoh :



Source Code :  
Disini kami menggunakan OpenCV pada C++


/**
* Code sample for displaying image histogram in OpenCV.
*/
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

void showHistogram(Mat& img)
{
        int bins = 256; // number of bins
        int nc = img.channels(); // number of channels

        vector<Mat> hist(nc); // histogram arrays

        // Initalize histogram arrays
        for (int i = 0; i < hist.size(); i++)
                hist[i] = Mat::zeros(1, bins, CV_32SC1);

        // Calculate the histogram of the image
        for (int i = 0; i < img.rows; i++)
        {
                for (int j = 0; j < img.cols; j++)
                {
                        for (int k = 0; k < nc; k++)
                        {
                                uchar val = nc == 1 ? img.at<uchar>(i,j) : img.at<Vec3b>(i,j)[k];
                                hist[k].at<int>(val) += 1;
                        }
                }
        }

        // For each histogram arrays, obtain the maximum (peak) value
        // Needed to normalize the display later
        int hmax[3] = {0,0,0};
        for (int i = 0; i < nc; i++)
        {
                for (int j = 0; j < bins-1; j++)
                        hmax[i] = hist[i].at<int>(j) > hmax[i] ? hist[i].at<int>(j) : hmax[i];
        }

        const char* wname[3] = { "blue", "green", "red" };
        Scalar colors[3] = { Scalar(255,0,0), Scalar(0,255,0), Scalar(0,0,255) };

        vector<Mat> canvas(nc);

        // Display each histogram in a canvas
        for (int i = 0; i < nc; i++)
        {
                canvas[i] = Mat::ones(125, bins, CV_8UC3);

                for (int j = 0, rows = canvas[i].rows; j < bins-1; j++)
                {
                        line(
                                canvas[i],
                                Point(j, rows),
                                Point(j, rows - (hist[i].at<int>(j) * rows/hmax[i])),
                                nc == 1 ? Scalar(200,200,200) : colors[i],
                                1, 8, 0
                        );
                }

                imshow(nc == 1 ? "value" : wname[i], canvas[i]);
        }
}

// Test the `showHistogram()` function above
int main()
{
        Mat src = imread("D:/tes.jpg");
        if (src.empty())
                return -1;
        showHistogram(src);
        imshow("src", src);
        waitKey(0);
        return 0;
}


 Disusun oleh  :

Anjani Mega W. (59410206)
Raditya Azteca Putra (55410527)

Kelompok Histogram, Kelas 4IA11