Yes, but forget the pixels:
- Divide the 0-255 range (or 0.-1. range especially if you want this to work with high bit depth) into N ranges (N doesn't need to be much bigger than 5, because the Curves that won't radically alter an image are smooth and monotonously increasing).
- Compute a value for the middle of each range.
- For each of these values:
- Use gimp_by_color_select_full(...) to select pixels on the source layer. You can use a threshold to include pixels with neighboring values. You have to use the "full" version to be able to select the channel on which the selection applies.
- Use gimp_drawable_histogram(...) on the source layer to obtain the average for the channel (normally you use the same channel/criteria that you used in the selection (R, G, B, VALUE...)). The histogram applies only to the selected pixels, so you can always ask for the full range. This gives you the average value for all the pixels with a channel value close to your initial value.
- Use gimp_drawable_histogram(...) again, on the target layer to obtain the average for the channel. This is the average value for the same pixels in the altered image.
- Use gimp_by_color_select_full(...) to select pixels on the source layer. You can use a threshold to include pixels with neighboring values. You have to use the "full" version to be able to select the channel on which the selection applies.
- The loop above gives you a list of (input,output) values from with you can approximate the curve (if not working on value, repeat on the R, G, B channels)