The input BMP image (24-bit RGB) contains one of three food types from
the given set (Table 1). Your task is to recognize the food and print
in the console window its three-character code given in Table 1.
The recognition should be performed in two/three steps:
Preparation of the histogram of given color component (table 1). The histogram contains number of pixels for each value of given color
component.
Based on the histogram the mode should be calculated. Mode of a set of data values is the value that appears most often.
Mode ranges of images belonging to different food types are different. So, you can make decision which food type the image should
be assigned to.
Input
BMP file containing the source image:
- sub format: 24 bit RGB – no compression,
- size: width 200px, height up to 200 px,
- file name: “source.bmp”
Output
- Console window – plain text
I don't think I understood the problem clearly.
What I understood is this:
Each food item has a specific major color-component (and, hence, a fixed mode-value of that specific color component). First, I need to calculate all mode values, and use them as constants in my program.
When I am given a sample image as an input, 1st I need to see which component is major (based on its mode-value).
Then, I need to compare that mode-value with previously computed constant mode values.
Closest one matches the food.
Am I correct?
If that is so, what is the purpose of that table with 12 rows? What is it given for?
Especially, take a look at 11th row of the table where all pictures are red, but says green-component.
Related
Please dont eat me because of this question :)
I have some data in excel and I would like to make a graphical representation of those data. Structure of my data:
persons ID : from 1 to 485 to every person, there is one parameter like average jumping distance and another parameter (like height) and finally there is a class to which every person belongs to (1, 2 or 3).
To assign persons to classes I have used k-means algorithm.
Now I would like to make a graph of this result. How can I do it please in excel (or by using another tool)?
Thank you
I would use a scatter (XY chart with markers and no lines). Plot average jumping distance on one axis, height on the second axis. Then for the classes I would separate all the data into 3 series and use different colors for each series. I would adjust the marker size to see which one works best with the data.
Here is a fast example to give you an idea how to it would look like. Its not as easy as just clicking once to insert the chart from the data though:
I have an image and I am picking colors by RGB (data sampling). I select N points from a specific region in the image which has the "same" color. By "same" I mean, that part of the image belongs to an object, (let's say a yellow object). Each picked point in the RGB case has three values [R,G,B]. For example: [120,150,225]. And the maximum and minimum for each field are 255 and 0 respectively.
Let's assume that I picked N points from the region of the object in the image. The points obviously have different RGB values but from the same family (a gradient of the specific color).
Question:
I want to find a range for each RGB field that when I apply a color filter on the image the pixels related to that specific object remain (to be considered as inliers). Is it correct to find the maximum and minimum from the sampled points and consider them as the filter range? For example if the max and min of the field R are 120 ,170 respectively, can it be used as a the range that should be kept.
In my opinion, the idea is not true. Because when choosing the max and min of a set of sampled data some points will be out of that range and also there will be some point on the object that doesn't fit in this range.
What is a better solution to include more points as inliers?
If anybody needs to see collected data samples, please let me know.
I am not sure I fully grasp what you are asking for, but in my opinion filtering in RGB is not the way to go. You should use a different color space than RGB if you want to compare pixels of similar color. RGB is good for representing colors on a screen, but you actually want to look at the hue, saturation and intensity (lightness, or luminance) for analysing visible similarities in colors.
For example, you should convert your pixels to HSI or HSL color space first, then compare the different parameters you get. At that point, it is more natural to compare the resulting hue in a hue range, saturation in a saturation range, and so on.
Go here for further information on how to convert to and from RGB.
What happens here is that you implicitly try to reinvent either color indexing or histogram back-projection. You call it color filter but it is better to focus on probabilities than on colors and color spaces. Colors of course not super reliable and change with lighting (though hue tends to stay the same given non-colored illumination) that's why some color spaces are better than others. You can handle this separately but it seems that you are more interested in the principles of calculating "filtering operation" that will do segmentation of the foreground object from background. Hopefully.
In short, a histogram back-projection works by first creating a histogram for R, G, B within object area and then back-projecting them into the image in the following way. For each pixel in the image find its bin in the histogram, calculate its relative weight (probability) given overall sum of the bins and put this probability into the image. In such a way each pixel would have probability that it belongs to the object. You can improve it by dividing with probability of background if you want to model background too.
The result will be messy but somewhat resemble an object segment plus some background noise. It has to be cleaned and then reconnected into object using separate methods such as connected components, grab cut, morphological operation, blur, etc.
The page linked to here has been a great help to me. The method of using the named function (=(ROW(INDIRECT("1:361"))-1)*PI()/180) to produce the circle data points is very slick compared to my original method that was to calculate them individually, writing them in to rows.
My data set includes some 50k rows of data, each one defining a circle. The set is divided into 50 groups and I need to plot one circle from each group as selected via a scroll bar controlling a LOOKUP routine.
Please can someone suggest how I might modify the function (=(ROW(INDIRECT("1:361"))-1)*PI()/180) to reduce the number of data points it produces? I want to reduce the computing load and also, it's not practical to display & format data markers with such high data density. My existing circles are produced with just 18 coordinate pairs and are satisfactorily rounded.
Thanks in advance. Steve.
This would give you 19 data points, 0 and 360 as the start/end points with another every 20%
=(ROW(INDIRECT("1:19"))-1)*PI()/9
I have more then 1 week reading about selective color change of an image. It meand selcting a color from a color picker and then select a part of image in which I want to change the color and apply the changing of color form original color to color of color picker.
E.g. if I select a blue color in color picker and I also select a red part in the image I should be able to change red color to blue color in all the image.
Another example. If I have an image with red apples and oranges and if I select an apple on the image and a blue color in the color picket, then all apples should be changing the color from red to blue.
I have some ideas but of course I need something more concrete on how to do this
Thank you for reading
As a starting point, consider clustering the colors of your image. If you don't know how many clusters you want, then you will need methods to determine whether to merge or not two given clusters. For the moment, let us suppose that we know that number. For example, given the following image at left, I mapped its colors to 3 clusters, which have the mean colors as shown in the middle, and representing each cluster by its mean color gives the figure at right.
With the output at right, now what you need is a method to replace colors. Suppose the user clicks (a single point) somewhere in your image, then you know the positions in the original image that you will need to modify. For the next image, the user (me) clicked on a point that is contained by the "orange" cluster. Then he clicked on some blue hue. From that, you make a mask representing the points in the "orange" cluster and play with that. I considered a simple gaussian filter followed by a flat dilation 3x5. Then you replace the hues in the original image according to the produced mask (after the low pass filtering, the values on it are also considered as a alpha value for compositing the images).
Not perfect at all, but you could have a better clustering than me and also a much-less-primitive color replacement method. I intentionally skipped the details about clustering method, color space, and others, because I used only basic k-means on RGB without any pre-processing of the input. So you can consider the results above as a baseline for anything else you can do.
Given the image, a selected color, and a target new color - you can't do much that isn't ugly. You also need a range, some amount of variation in color, so you can say one pixel's color is "close enough" while another is clearly "different".
First step of processing: You create a mask image, which is grayscale and varying from 0.0 to 1.0 (or from zero to some maximum value we'll treat as 1.0), and the same size as the input image. For each input pixel, test if its color is sufficiently near the selected color. If it's "the same" or "close enough" put 1.0 in the mask. If it's different, put 0.0. If is sorta borderline, put an in-between value. Exactly how to do this depends on the details of the image.
This might work best in LAB space, and testing for sameness according to the angle of the A,B coordinates relative to their origin.
Once you have the mask, put it aside. Now color-transform the whole image. This might be best done in HSV space. Don't touch the V channel. Add a constant to S, modulo 360deg (or mod 256, if S is stored as bytes) and multiply S by a constant chosen so that the coordinates in HSV corresponding to the selected color is moved to the HSV coordinates for the target color. Convert the transformed S and H, with the unchanged L, back to RGB.
Finally, use the mask to blend the original image with the color-transformed one. Apply this to each channel - red, green, blue:
output = (1-mask)*original + mask*transformed
If you're doing it all in byte arrays, 0 is 0.0 and 255 is 1.0, and be careful of overflow and signed/unsigned problems.
I am facing this difficulty :
I want to indicate where my user is in a range of data in a chart, as well as where the average is.
That's not too difficult, that part I figured out already :)
However, if I have several charts in 1 report, my "user bar'" sometimes gets a different color, according whether it's below or above average.
This is very confusing for my users, because they can't think, let's say, "the yellow bar is always me".
The legend always has to be read, and that's not so user-friendly.
I'll illustrate the problem in an attachment.
I know how to have the same series color, but within this series, I want 1 particular color to always represent the value of the average, another to represent my user, etc.
Is this possible ?!
Thanks a lot in advance.
IMAGE CAN BE FOUND HERE : http://www.kava.be/cms_bldn/jaspercharts.jpg
EDIT: I'm working with the ChartCustomizer now :
BarRenderer renderer = (BarRenderer) chart.getCategoryPlot().getRenderer();
renderer.setSeriesPaint(0, Color.blue);
renderer.setSeriesPaint(1, Color.yellow);
renderer.setSeriesPaint(2, Color.green);
renderer.setSeriesPaint(3, Color.red);
Still, this handles the series in the order they arrive from the resultset.
What I'm looking for is how I can use the series expression (as entered in 'series expression' field in the categorie series dialogue), instead of fixed indexes like 0-3.
I would suggest checking whether the sequence of your series is same in both the chart's chart data, plus color series in chart properties is also or not.
If it is same than it should print same.